2012-06-02 164 views
1

我遇到了一個問題,以向用戶展示同一個CALayer中的圓弧和矩形。我成功繪製兩者,但只有當弧線相同或在直線座標上方繪製時才顯示矩形。Objective-C中CALayer中的繪製圓弧和矩形

任何想法我想念什麼?

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)p_contex 
{ 
    CGMutablePathRef thePath = CGPathCreateMutable(); 
    CGPathMoveToPoint(thePath,NULL,mReference.x,mReference.y); 
    CGPathAddArc(thePath,NULL, 
       mReference.x, mReference.y, 
       S_RADIO, lStartAngle, lStopAngle , 
       0); 
    CGPathCloseSubpath(thePath); 

    CGContextSetRGBFillColor(p_contex, lRed,lGreen,lBlue,lAlpha); 
    CGContextSetRGBStrokeColor(p_contex, lRed,lGreen,lBlue,lAlpha); 
    CGContextAddPath(p_contex, thePath); 

    CGContextSaveGState(p_contex); 
    CGContextClip(p_contex); 
    CGContextDrawRadialGradient(p_contex, 
           [self buildGradientColor], 
           mReference , 5, mReference, S_RADIO, 0); 

    CGContextSaveGState(p_contex); 

    // release the path 
    CFRelease(thePath); 
    CGGradientRelease(mGradient); 


    CGMutablePathRef retPath = CGPathCreateMutable(); 
    CGRect rect = CGRectMake(0,300, 200, 40); 
    float radius = 10; 
    CGRect innerRect = CGRectInset(rect, radius, radius); 

    CGFloat inside_right = innerRect.origin.x + innerRect.size.width; 
    CGFloat outside_right = rect.origin.x + rect.size.width; 
    CGFloat inside_bottom = innerRect.origin.y + innerRect.size.height; 
    CGFloat outside_bottom = rect.origin.y + rect.size.height; 

    CGFloat inside_top = innerRect.origin.y; 
    CGFloat outside_top = rect.origin.y; 
    CGFloat outside_left = rect.origin.x; 

    CGPathMoveToPoint(retPath, NULL, innerRect.origin.x, outside_top); 

    CGPathAddLineToPoint(retPath, NULL, inside_right, outside_top); 
    CGPathAddArcToPoint(retPath, NULL, outside_right, outside_top, outside_right, inside_top, radius); 
    CGPathAddLineToPoint(retPath, NULL, outside_right, inside_bottom); 
    CGPathAddArcToPoint(retPath, NULL, outside_right, outside_bottom, inside_right, outside_bottom, radius); 

    CGPathAddLineToPoint(retPath, NULL, innerRect.origin.x, outside_bottom); 
    CGPathAddArcToPoint(retPath, NULL, outside_left, outside_bottom, outside_left, inside_bottom, radius); 
    CGPathAddLineToPoint(retPath, NULL, outside_left, inside_top); 
    CGPathAddArcToPoint(retPath, NULL, outside_left, outside_top, innerRect.origin.x, outside_top, radius); 

    CGPathCloseSubpath(retPath); 


    CGContextAddPath(p_contex, retPath); 
    CGContextFillPath(p_contex); 
    } 

回答

1

這裏的問題是,你畫一個弧線,然後填充rectagle 所以電弧越來越繪製此填充矩形

一個快速的解決辦法是拉伸後的圓弧繪製移動背後的矩形 在繪製矩形之後移動弧的繪圖

+0

太好了,你知道爲什麼嗎?我的意思是,背後的邏輯是什麼? – Agus

+0

那麼我想你畫的矩形是填充的,所以它重疊並覆蓋舊弧:) –