2016-06-07 26 views
3

Wie zu überprüfen UIBezierPath ist geschlossener Pfad oder nicht (geschlossener Pfad ist wie geschlossene Kontur bedeutet, dass es jede Form wie Dreieck, Quadrat, Polygon usw. erstellt), und wenn es geschlossen ist dann füllen Sie nur den Pfad?Check UIBezierPath geschlossen oder nicht

Das Folgende stellt den Bereich dar, in dem es die Form ausfüllen sollte; letzte 2 Form definierende Kontur und einfache geschlossene Kontur geschlossen, die in nur Farbe gefüllt werden können:

enter image description here

Image Source

Das folgende ist mein Code für das gleiche, gibt es vier Plätze in ihm aber füllen nur 3 Quadrate; will auch wissen, ist es möglich, die Fläche der gefüllten Fläche in Quadratfuß zu finden, wie ich 4 Quadrate hier bekomme, wie man die Gesamtfläche überprüft, die es in 4 Quadrate bedeckt?

UIBezierPath *mainPath =[UIBezierPath bezierPath]; 
[mainPath moveToPoint:CGPointMake(50, 100)]; 
[mainPath addLineToPoint:CGPointMake(0, 100)]; 
[mainPath addLineToPoint:CGPointMake(0, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 200)]; 
[mainPath addLineToPoint:CGPointMake(100, 200)]; 
[mainPath addLineToPoint:CGPointMake(100, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 150)]; 
[mainPath addLineToPoint:CGPointMake(50, 100)]; 
[mainPath addLineToPoint:CGPointMake(100, 100)]; 
[mainPath addLineToPoint:CGPointMake(150, 100)]; 
[mainPath addLineToPoint:CGPointMake(150, 150)]; 
[mainPath addLineToPoint:CGPointMake(100, 150)]; 
[mainPath addLineToPoint:CGPointMake(100, 100)]; 
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
shapeLayer.lineWidth = 5.0; 
shapeLayer.strokeColor = [UIColor blueColor].CGColor; 
shapeLayer.path =mainPath.CGPath; 
shapeLayer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.5].CGColor; 
[[self.view layer] addSublayer:shapeLayer]; 

Antwort

0

Warum Sie nicht verwenden, um die mainPath.closePath wird es automatisch den Pfad für Sie schließen und füllen. Wenn Sie mehr Informationen haben über Schließweg automatisch wollen oder manuell können Sie einen Blick here, hieß es, dass:

Der Unterschied ist, dass die [closePath] Verfahren tatsächlich ein zusätzlichen Pfad Element auf das darunter liegende CGPath fügt das unterstützt die UIBezierPath.

Wenn Sie [closePath], dann eine zusätzliche CGPathElement mit einem Typ von kCGPathElementCloseSubpath wird unmittelbar nach dem letzten Liniensegment zu dem Ende des Weges angehängt werden.

Für den Bereich bedeckt, können Sie den Begrenzungsrahmen Ihrer UIBezierPath bekommen, aber ich denke, dass es einfach mehr sein könnte für Sie verschiedene UIBezierPath (eine für jeden Ihrer Quadrat) und berechnen dann den Begrenzungsrahmen muss für jedes Quadrat. Wenn Sie den Begrenzungsrahmen von Ihrem Weg haben:

let bounds = CGPathGetBoundingBox(yourPath.CGPath) 
+2

Nun, alle Linien dynamisch hinzugefügt werden, und ich will nicht zu closePath; Ich möchte nur überprüfen, ob es geschlossen ist oder nicht. und um den Bereich zu nehmen, dann könnte die Form irgendein wie ein Dreieck oder so sein, so dass der Bereich für alle unterschiedlichen Formen in Quadratfuß gezählt werden könnte. –

1

ich eine ähnliche Frage zu CGPathhere beantwortet haben. Da Sie die CGPath für eine UIBezierPath bekommen können, denke ich, dass es auch hier gilt. Dies ist für Swift 3.x. Ich habe schwer von this answer geliehen und die isClosed() Funktion hinzugefügt.

extension CGPath { 

func isClosed() -> Bool { 
    var isClosed = false 
    forEach { element in 
     if element.type == .closeSubpath { isClosed = true } 
    } 
    return isClosed 
} 

func forEach(body: @convention(block) (CGPathElement) -> Void) { 
    typealias Body = @convention(block) (CGPathElement) -> Void 
    let callback: @convention(c) (UnsafeMutableRawPointer, UnsafePointer<CGPathElement>) -> Void = { (info, element) in 
     let body = unsafeBitCast(info, to: Body.self) 
     body(element.pointee) 
    } 
    print(MemoryLayout.size(ofValue: body)) 
    let unsafeBody = unsafeBitCast(body, to: UnsafeMutableRawPointer.self) 
    self.apply(info: unsafeBody, function: unsafeBitCast(callback, to: CGPathApplierFunction.self)) 
} 
} 

Hier ist, wie Sie es verwenden:

myBezierPath.cgPath.isClosed()