2016-06-22 3 views
2

ich einen Bogen haben, die ich wie folgt gezeichnet haben:iOS: Core Graphics - Clipping einen Bogen mit CGContextClip und Linecap = .Round

func drawBackgroundMask(context: CGContextRef, 
         center: CGPoint, 
         radius: CGFloat, 
         lineWidth: CGFloat, 
         startAngle: CGFloat, 
         endAngle: CGFloat) { 
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0 

    CGContextSetLineWidth(context, lineWidth) 
    CGContextSetLineCap(context, .Round) 

    CGContextAddArc(context, 
        center.x, 
        center.y, 
        adjustedRadius, 
        startAngle, 
        endAngle, 
        0) 

    //CGContextClosePath(context) 
    //CGContextClip(context) 
    CGContextStrokePath(context) 

} 

Mit den obigen Zeilen auf Kommentar, ich folgendes erstellen:

black arc

wenn ich jedoch von uncommenting-out die beiden Codezeilen oben und dann Malerei der Hintergrund eine solide die gezeichneten Form als Maske zu verwenden versuchen, erhalte ich ein anderes Ergebnis:

func drawBackgroundMask(context: CGContextRef, 
         center: CGPoint, 
         radius: CGFloat, 
         lineWidth: CGFloat, 
         startAngle: CGFloat, 
         endAngle: CGFloat) { 
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0 

    CGContextSetLineWidth(context, lineWidth) 
    CGContextSetLineCap(context, .Round) 

    CGContextAddArc(context, 
        center.x, 
        center.y, 
        adjustedRadius, 
        startAngle, 
        endAngle, 
        0) 

    CGContextClosePath(context) 
    CGContextClip(context) 
    CGContextStrokePath(context) 

    CGContextSetRGBFillColor(context, 100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0); 
    CGContextFillRect(context, rect); 
} 

as mask

Kann jemand mir erklären, warum mit dem Hubzündungs ​​als Schnittmaske verursacht es anders behandelt werden, als es gezogen wird? Kann mir jemand den richtigen Weg zeigen, eine Maske in Form eines Bogens mit abgerundeten Enden zu erstellen? Dieses Problem ist Teil eines größeren Steuerelements, an dem ich arbeite, wo ich einen anderen Bogen mit der Form des Bogens schneiden muss.

Antwort

2

In Ihrem zweiten Beispiel berücksichtigt der Clip nur den Pfad des Bogens. Die verschiedenen Stroke-Parameter wie Linienbreite, Cap usw. werden nur verwendet, wenn Sie den Pfad tatsächlich streichen, was Sie nicht tun.

Zuerst richten Sie einen Pfad in der CGContext, dann Sie es abschneiden. Der Pfad im Kontext wird anschließend konsumiert. Wie the documentation sagt:

Nach dem Festlegen der neuen Beschneidungspfad, die Funktion setzt den aktuellen Pfad des Kontexts auf einen leeren Pfad.

Also, wenn Sie CGContextStrokePath nennen, hat es keine Auswirkung, weil zu dieser Zeit der Strompfad im CGContext leer.

Es klingt wie Sie CGContextReplacePathWithStrokedPath verwenden möchten, bevor Sie clip. Die Dokumentation erwähnt sogar genau diesen Anwendungsfall:

Zum Beispiel können Sie auf die stroked Version eines Pfades abschneiden, indem Sie diese Funktion aufrufen, gefolgt von einem Aufruf der Funktion CGContextClip.

func drawBackgroundMask(context: CGContextRef, 
        center: CGPoint, 
        radius: CGFloat, 
        lineWidth: CGFloat, 
        startAngle: CGFloat, 
        endAngle: CGFloat) { 
    let adjustedRadius: CGFloat = radius - (lineWidth/2) - 0 

    CGContextSetLineWidth(context, lineWidth) 
    CGContextSetLineCap(context, .Round) 

    CGContextAddArc(context, 
        center.x, 
        center.y, 
        adjustedRadius, 
        startAngle, 
        endAngle, 
        0) 

    CGContextReplacePathWithStrokedPath(context) 
    CGContextClip(context) 

    CGContextSetRGBFillColor(context, 100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0); 
    CGContextFillRect(context, rect); 
} 
Verwandte Themen