2014-05-06 7 views
10

Ho un'app in cui prendo un UIBezierPath e lo utilizzo come pennello da una serie di appendPath: calls. Dopo pochi passaggi e con forme di pennello davvero complesse, la memoria si esaurisce e l'app si ferma. Quello che voglio veramente fare è un full on union esattamente come fa Paint Code, ma non riesco a trovare alcun modo per farlo.Unione UIBezierPaths piuttosto che apend percorso

Come dovrei fare per unire due o più UIBezierPath?

EDIT:

Ecco una visuale di ciò che voglio raggiungere in modo dinamico.

Nel codice della vernice si prende due percorsi e li sovrappongono come questo: Overlapping paths in Paint Code

ma voglio fondere/unione di loro in un nuovo percorso singolo come:

Merged paths in Paint Code

Si noti che in il pannello inferiore di Paint Code contiene un codice per ora una sola forma e questo è ciò che voglio essere in grado di arrivare a programmare con forse 1000 percorsi originali.

+0

un approccio è di rendere ad un'immagine percorsi di corrente quando, per esempio, il conteggio percorso raggiunge un certo numero. Ciò impedirà di dover disegnare ogni percorso ogni volta che un nuovo percorso viene aggiunto. – MDB983

+0

Il problema è che questo è il primo di diversi passaggi, tra cui la creazione di una maschera dal percorso e quindi il tracciamento. – Martin

+0

la pubblicazione di un codice potrebbe dare agli altri un'idea migliore di ciò che stai cercando di realizzare – MDB983

risposta

0

È possibile utilizzare il GPCPolygon, un involucro Objective-C per GPC

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

o

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

1

È possibile ottenere risultato desiderato facilmente seguendo 2 concetti di core grafico: -

i) CGBlendMode ii) OverLap2Layer

I metodi di fusione raccontano un contesto come applicare nuovi contenuti a se stessa. Determinano in che modo i dati dei pixel vengono combinati digitalmente.

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! 
      } 
     } 

primo percorso: -

enter image description here

secondo percorso: -

enter image description here

Risultato Finale: -

enter image description here

Riferimento: - Blend in Core Graphics, Creating Image

GitHub Demo