Союз UIBezierPaths, а не apend path

У меня есть приложение, где я беру UIBezierPath и использую его как кисть из серии appendPath: calls. После нескольких шагов и с очень сложной формой кисти память заканчивается, и приложение останавливается. То, что я действительно хочу сделать, - это полный союз, как и код Paint Code, но я не могу найти способ сделать это.

Как я могу объединить два или более UIBezierPaths?

EDIT:

Вот визуальное представление о том, чего я хочу достичь динамически.

В Paint Code вы берете два пути и перекрываете их следующим образом: Overlapping paths in Paint Code

НО я хочу объединить/объединить их в один новый единственный путь, например:

Merged paths in Paint Code

Обратите внимание, что на нижней панели Paint Code есть код для одной единственной фигуры, и это то, что я хочу, чтобы получить возможность программно, возможно, с 1000 оригинальными путями.

Ответ 1

Вы можете легко получить желаемый результат, следуя двум концепциям Core Graphics: -

i) CGBlendModeб) OverLap2Layer

Режимы смешивания говорят о том, как применять новый контент к себе. Они определяют, как цифровые данные смешиваются в цифрах.

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

Первый путь: -

введите описание изображения здесь

Второй путь: -

введите описание изображения здесь

Итоговый результат: -

введите описание изображения здесь

Справка: - Blend в Core Graphics, Создание образа

Демо-версия GitHub

Ответ 2

Вы можете использовать GPCPolygon, обертку Objective-C для ГПХ

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

или

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