2014-05-06 16 views
10

Mam aplikację, w której biorę UIBezierPath i używać go jako pędzla przez szereg appendPath: wywołania. Po kilku krokach i przy naprawdę skomplikowanych kształtach pędzla pamięć kończy się, a aplikacja zatrzymuje się. To, co naprawdę chcę zrobić, to kompletny ujednolicony kod jak Paint Code, ale nie mogę znaleźć żadnego sposobu na zrobienie tego.UibezierPaths Unii zamiast ścieżek

W jaki sposób chciałbym połączyć dwa lub więcej UIBezierPaths?

EDIT:

Oto wizualnym, co chcę osiągnąć dynamicznie.

w kodzie programu Paint wziąć dwie ścieżki i pokrywają je tak: Overlapping paths in Paint Code

ale chcę scalić/Unii je w jeden nowy pojedynczej ścieżki jak:

Merged paths in Paint Code

pamiętać, że w dolny panel programu Paint Code zawiera kod na jeden kształt i to jest to, co chcę móc programowo uzyskać z 1000 oryginalnych ścieżek.

+0

Jedno podejście do renderowania się obrazu bieżącej ścieżki, gdy, na przykład, liczba ścieżka osiąga określoną wartość. Zapobiega to konieczności rysowania każdej ścieżki za każdym razem, gdy dołączana jest nowa ścieżka. – MDB983

+0

Problem polega na tym, że jest to pierwszy z kilku kroków, w tym utworzenie maski ze ścieżki, a następnie głaskanie. – Martin

+0

opublikowanie kodu może dać innym lepsze wyobrażenie o tym, co próbujesz osiągnąć – MDB983

Odpowiedz

0

można użyć GPCPolygon An owijka Cel C na GPC

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

lub

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

1

można uzyskać pożądany wynik łatwo przez kolejne 2 koncepcji Grafiki Rdzeń: -

i) CGBlendMode ii) OverLap2Layer

Tryby mieszania powiedzieć kontekst, jak zastosować nowe treści do siebie. Określają, w jaki sposób dane cyfrowe są mieszane cyfrowo.

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

Pierwszy Ścieżka: -

enter image description here

druga ścieżka: -

enter image description here

ostateczny wynik: -

enter image description here

odniesienia: - Blend in Core Graphics, Creating Image

GitHub Demo