CABasicAnimation 圆圈 CAShapeLayer 在地图上移动而不是缩放

Posted

技术标签:

【中文标题】CABasicAnimation 圆圈 CAShapeLayer 在地图上移动而不是缩放【英文标题】:CABasicAnimation circle CAShapeLayer moving across the map instead of scaling 【发布时间】:2017-11-29 10:56:57 【问题描述】:

我正在尝试创建一个隐藏视图的动画。起初,它从屏幕上的一个点(例如 150)开始,然后按比例放大直到适合整个屏幕。这是我尝试过的

public func testAnimation(anchor : CGRect)
    self.isHidden = false
    let mask = CAShapeLayer()
    let radius = 15
    mask.path = UIBezierPath(roundedRect: CGRect(x: 150,y: 150, width:  Double(radius), height: Double(radius)), cornerRadius: CGFloat(radius/2)).cgPath
    mask.position = CGPoint(x: 150,y: 150 )
    mask.fillColor = UIColor.blue.cgColor

    self.layer.mask = mask
    let oldBounds = mask.bounds
    let newBounds = CGRect.init(x: 150,y: 150,width: 1600,height: 1600)
    let revealAnimation = CABasicAnimation(keyPath: "bounds")
    revealAnimation.fromValue = NSValue(cgRect: oldBounds)
    revealAnimation.toValue = NSValue(cgRect: newBounds)
    revealAnimation.duration = 5

    //Keep the bounds after the animation completes.
    mask.bounds = newBounds
    mask.add(revealAnimation, forKey: "revealAnimation")

这个 sn-p 的问题是它会导致一个小圆圈在屏幕中移动,而不是让圆圈变大。我使用了这里找到的代码:http://blog.ericd.net/2015/10/22/swift-animating-a-mask-for-a-uiview/(showUnderView 函数),它就像一个魅力。我将 CALayer 换成 CAShapeLayer 以获得圆形效果,但它不起作用。

【问题讨论】:

【参考方案1】:

为 CALayer 的边界设置动画本来可以,但在这里您使用的是 CAShapeLayer。设置新边界不会重绘和缩放形状。

相反,您应该尝试直接为形状设置动画:

let finalRadius: CGFloat = 1600
let finalPath = UIBezierpath(roundedRect: CGRect(x: 150, y: 150, width: finalRadius, height: finalRadius), cornerRadius: finalRadius / 2).cgPath

let revealAnimation = CABasicAnimation(keyPath: "path")
revealAnimation.toValue = finalPath
revealAnimation.duration = 5
mask.add(revealAnimation, forKey: "revealAnimation")

这将重新绘制所需大小的形状。

如果您想保持形状居中,您可以同时为position 设置动画。

【讨论】:

我怎样才能保持位置稳定?我试过这个let finalPosition = CGPoint(x:150,y:150) let animAnim = CABasicAnimation(keyPath: "position") animAnim.toValue = finalPosition animAnim.duration = 5 mask.add(animAnim,forKey: nil) 但圆圈仍在屏幕上移动 初始位置已经是 CGPoint(x: 150, y: 150),所以你必须找到最终位置,这样你的形状的中心就在同一个地方。 let currentCenter = CGPoint(x: 150 + radius / 2, y: 150 + radius / 2) let finalPosition = CGPoint(x: currentCenter.x - 1600 / 2, y: currentCenter.y - 1600 / 2)

以上是关于CABasicAnimation 圆圈 CAShapeLayer 在地图上移动而不是缩放的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CABasicAnimation 结束之前重置它?

根据内容大小设置 UIView 的大小

在 UIView 中为多个形状设置动画

CAGradientLayer 的中心在旋转动画上返回错误的位置

像轮子动画一样旋转图像,并在随机位置停止

CABasicAnimation - 未调用 animationDidStop