简体   繁体   English

UIBezierPath animation 从圆形到圆角方形

[英]UIBezierPath animation from circle to rounded square

I'm trying to animate from a circle to a square with rounded corners.我正在尝试从圆形动画到带有圆角的正方形。 As far as I understand, number of points from both paths should be equal for smooth animation.据我了解,对于平滑的 animation,两条路径的点数应该相等。 So I wrote a function that builds a circle bases on a number of arcs:所以我写了一个 function ,它基于多个圆弧构建一个圆:

private func circleShape(segmentNumber: Int = 8, radius: CGFloat = 32) -> CGPath {
    let center = self.bounds.center
    let circlePath = UIBezierPath()
    let segmentAngle = CGFloat.pi * CGFloat(2) / CGFloat(segmentNumber)
    var currentAngle: CGFloat = 0

    for _ in 0 ..< segmentNumber {
        let nextAngle = currentAngle + segmentAngle
        circlePath.addArc(withCenter: center, radius: radius,
                startAngle: currentAngle, endAngle: nextAngle, clockwise: true)
        currentAngle = nextAngle
    }

    circlePath.close()
    return circlePath.cgPath
}

I'm checking number of points with getPathElementsPointsAndTypes() and it increases unproportionally to the segmentNumber (segmentNumber: 1, points: 13; sN: 2, p: 14; sN: 3, p: 21; sN: 4, p: 16).我正在使用getPathElementsPointsAndTypes()检查点数,它与段号不成比例地增加(段号:1,点:13;sN:2,p:14;sN:3,p:21;sN:4,p:16 )。 So I can't find a segmentNumber that would give the same number of points (19) as the function that draws the square:所以我找不到与绘制正方形的segmentNumber给出相同点数(19)的段号:

private func squareShape(size: CGFloat = 44, radius: CGFloat = 8) -> CGPath {
    let rect = CGRect(center: self.bounds.center, size: CGSize(width: size, height: size))
    let left = CGFloat.pi
    let up = CGFloat(1.5) * CGFloat.pi
    let down = CGFloat.pi / CGFloat(2)
    let right = CGFloat(0.0)
    let squarePath = UIBezierPath()

    squarePath.addArc(withCenter: CGPoint(x: rect.minX + radius, y: rect.minY + radius), radius: radius, startAngle: left, endAngle: up, clockwise: true)
    squarePath.addArc(withCenter: CGPoint(x: rect.maxX - radius, y: rect.minY + radius), radius: radius, startAngle: up, endAngle: right, clockwise: true)
    squarePath.addArc(withCenter: CGPoint(x: rect.maxX - radius, y: rect.maxY - radius), radius: radius, startAngle: right, endAngle: down, clockwise: true)
    squarePath.addArc(withCenter: CGPoint(x: rect.minX + radius, y: rect.maxY - radius), radius: radius, startAngle: down, endAngle: left, clockwise: true)
    squarePath.close()

    return squarePath.cgPath
}

Animation code: Animation 代码:

let animation = CABasicAnimation(keyPath: "path")
animation.duration = 2
animation.toValue = self.circleShape()
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)

self.testLayer.add(animation, forKey: "pathAnimation")

Result:结果:

在此处输入图像描述

What could I change to make the animation same smooth as in example without rounded rects?我可以改变什么来使 animation 与没有圆角矩形的示例一样平滑?

在此处输入图像描述

You can simply have two paths你可以简单地有两条路径

    func circlePath () -> UIBezierPath {
        return UIBezierPath(roundedRect: CGRect(x:0, y:0, width:50, height:50), cornerRadius: 25)
    }

    func squarePath () -> UIBezierPath {
        return UIBezierPath(roundedRect: CGRect(x:0, y:0, width:30, height:30), cornerRadius: 4)
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM