Как выровнять CAShapeLayer к родительскому представлению - PullRequest
0 голосов
/ 17 мая 2019

У меня есть фигура Безье, которая должна быть задана как форма родительского фрейма.Мне нужно масштабировать его до правильного размера, чтобы он мог поместиться в его родителя в качестве границ.Я использую CAShapeLayer, чтобы добавить путь Безье к родительскому представлению subLayer, а затем анимировать его.

class FrameView: NSObject {
    var shapeLayer: CAShapeLayer!

    func frameLayer(frame targetFrame: UIView) -> CAShapeLayer {
        let bezierPath = UIBezierPath()
        bezierPath.move(to: CGPoint(x: 34.93, y: 0))
        bezierPath.addCurve(to: CGPoint(x: 36.05, y: 0.2), controlPoint1: CGPoint(x: 34.79, y: 0), controlPoint2: CGPoint(x: 35.45, y: -0))
        bezierPath.addLine(to: CGPoint(x: 36.16, y: 0.22))
        bezierPath.addCurve(to: CGPoint(x: 38, y: 2.85), controlPoint1: CGPoint(x: 37.27, y: 0.63), controlPoint2: CGPoint(x: 38, y: 1.68))
        bezierPath.addCurve(to: CGPoint(x: 38, y: 3), controlPoint1: CGPoint(x: 38, y: 3), controlPoint2: CGPoint(x: 38, y: 3))
        // MORE CODE FOR BEZIERPATH ...

        bezierPath.apply(CGAffineTransform(translationX: targetFrame.bounds.minX, y: targetFrame.bounds.minY))
        bezierPath.apply(CGAffineTransform(scaleX: 2.0, y: 2.0))

        self.shapeLayer = CAShapeLayer()
        shapeLayer.path = bezierPath.cgPath
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.strokeColor = UIColor.clear.cgColor
        return shapeLayer

Ниже приведено то, что я получаю.Я попробовал некоторые решения в StackOverflow и у меня не получилось.Что мне нужно, это установить эту белую рамку в качестве границ родительского представления, представляющего собой прозрачный серый прямоугольник:

enter image description here

1 Ответ

0 голосов
/ 17 мая 2019

Нашли решение, Первой ошибкой было то, что я менял кадр UIView где-то во ViewController, и он всегда давал мне неправильную координату, чем я ожидал, поэтому я просто создал UIView в раскадровке и использовал его выход.

Вторая ошибка - неправильный математический расчет.

чтобы подогнать shapeLayer по размеру родительского представления, я сделал это:

bezierPath.apply(CGAffineTransform(scaleX: abs(targetFrame.bounds.size.width / bezierPath.cgPath.boundingBox.width), y: abs(targetFrame.bounds.size.height / bezierPath.cgPath.boundingBox.height)))

до того, как я попытался разделить целевой кадр и размеры bezierRect, но я не использовал abs (), и это дало мне неправильный результат!

enter image description here

...