2014-05-06 2 views
10

Ich habe eine App, wo ich ein UIBezierPath nehme und es als eine Bürste durch eine Reihe von appendPath: Anrufe benutze. Nach ein paar Tips und mit wirklich komplexen Pinselformen geht die Erinnerung aus und die App kommt zum Stillstand. Was ich wirklich tun möchte, ist eine volle Vereinigung genau wie Paint Code, aber ich kann keinen Weg finden, dies zu tun.Union UIBezierPfadspfade statt apend Pfad

Wie würde ich zwei oder mehr UIBezierPfads verbinden?

EDIT:

Hier ist eine visuelle, was ich dynamisch erreichen wollen.

in Paint-Code nehmen Sie zwei Pfade und sie so überlappen: Overlapping paths in Paint Code

aber ich will/union sich in einen neuen wie einzigen Pfad fusionieren:

Merged paths in Paint Code

Beachten Sie, dass in In der unteren Leiste von Paint Code befindet sich Code für eine einzige Form und das möchte ich programmatisch mit vielleicht 1000 Originalpfaden bekommen.

+0

ein Ansatz ist es, die Strompfade zu einem Bild zu machen, wenn zum Beispiel der Wegzahlenwert eine bestimmte Anzahl erreicht. Dies verhindert, dass jeder Pfad jedes Mal neu gezeichnet werden muss, wenn ein neuer Pfad angehängt wird. – MDB983

+0

Das Problem ist, dass dies der erste von mehreren Schritten ist, einschließlich das Erstellen einer Maske aus dem Pfad und dann streichen. – Martin

+0

das Posten eines Codes könnte anderen eine bessere Vorstellung davon geben, was Sie erreichen möchten – MDB983

Antwort

0

können Sie verwenden die GPCPolygon, eine Objective-C-Wrapper für GPC

-GPCPolygonSet*) initWithPolygons:(NSMutableArray*)points;

oder

- (GPCPolygonSet*) unionWithPolygonSet:(GPCPolygonSet*)p2;

1

Sie können folgende 2 Konzepte von Core Graphics Ergebnis leicht gewünscht erhalten: -

i) CGBlendMode ii) OverLap2Layer

Mischmodi sagen einen Kontext, wie neue Inhalte selbst anzuwenden. Sie bestimmen, wie Pixeldaten digital gemischt werden.

class UnionUIBezierPaths : UIView { 

    var firstBeizerPath:UIImage! 
    var secondBeizerPath:UIImage! 

    override func draw(_ rect: CGRect) { 
     super.draw(rect) 

     firstBeizerPath = drawOverLapPath(firstBeizerpath: drawCircle(), secondBeizerPath: polygon()) 
     secondBeizerPath = drawOverLapPath(firstBeizerpath: polygon(), secondBeizerPath: drawCircle()) 

     let image = UIImage().overLap2Layer(firstLayer:firstBeizerPath , secondLayer:secondBeizerPath) 
    } 


    func drawCircle() -> UIBezierPath { 
     let path = UIBezierPath(ovalIn: CGRect(x: 40, y: 120, width: 100, height: 100)) 
     return path 
    } 

    func polygon() -> UIBezierPath { 
     let beizerPath = UIBezierPath() 
     beizerPath.move(to: CGPoint(x: 100, y: 10)) 
     beizerPath.addLine(to: CGPoint(x: 200.0, y: 40.0)) 
     beizerPath.addLine(to: CGPoint(x: 160, y: 140)) 
     beizerPath.addLine(to: CGPoint(x: 40, y: 140)) 
     beizerPath.addLine(to: CGPoint(x: 0, y: 40)) 
     beizerPath.close() 
     return beizerPath 
    } 

    func drawOverLapPath(firstBeizerpath:UIBezierPath ,secondBeizerPath:UIBezierPath) -> UIImage { 

     UIGraphicsBeginImageContext(self.frame.size) 

     let firstpath = firstBeizerpath 
     UIColor.white.setFill() 
     UIColor.black.setStroke() 
     firstpath.stroke() 
     firstpath.fill() 

     // sourceAtop = 20 
     let mode = CGBlendMode(rawValue:20) 
     UIGraphicsGetCurrentContext()!.setBlendMode(mode!) 


     let secondPath = secondBeizerPath 
     UIColor.white.setFill() 
     UIColor.white.setStroke() 
     secondPath.fill() 
     secondPath.stroke() 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return image! 
    } 



    func drawImage(image1:UIImage , secondImage:UIImage) ->UIImage 
    { 
     UIGraphicsBeginImageContext(self.frame.size) 
     image1.draw(in: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) 
     secondImage.draw(in: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) 

     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage! 
    } 

     } 

     //OverLap2Layer 
     extension UIImage { 
     func overLap2Layer(firstLayer:UIImage , secondLayer:UIImage) -> UIImage { 

       UIGraphicsBeginImageContext(firstLayer.size) 
       firstLayer.draw(in: CGRect(x: 0, y: 0, width: firstLayer.size.width, height: firstLayer.size.height)) 
       secondLayer.draw(in: CGRect(x: 0, y: 0, width: firstLayer.size.width, height: firstLayer.size.height)) 

       let newImage = UIGraphicsGetImageFromCurrentImageContext() 
       UIGraphicsEndImageContext() 
       return newImage! 
      } 
     } 

Erster Pfad: -

enter image description here

Zweiter Pfad: -

enter image description here

Endergebnis: -

enter image description here

Referenz: - Blend in Core Graphics, Creating Image

GitHub Demo