从圆到圆方的UIBezierPath动画。

问题描述 投票:3回答:1

我想把一个圆变成一个圆角的正方形。根据我的理解,两条路径上的点数量应该相等,这样才能实现平滑的动画效果。所以我写了一个函数,它可以在若干圆弧的基础上建立一个圆。

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
}

我在检查点的数量 getPathElementsPointsAndTypes() 并且它与segmentNumber不成正比地增加(segmentNumber:1,点数:13;sN:2,p:14;sN:3,p:21;sN:4,p:16)。所以我找不到一个 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
}

动画代码:

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

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

动画代码: 结果:

enter image description here

我可以做些什么来让动画变得像在这里一样流畅?例子 没有圆角的矩形?

enter image description here

ios swift core-animation
1个回答
4
投票

你可以简单地有两条路径

    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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.