在我的应用中,我使用UIView
子类来显示各种信息。我希望此视图显示为圆形,因此我将视图cornerRadius
上的layer
设置为self.bounds.size.width / 2
。
这可以按预期工作,直到我尝试为它们设置动画。我使用UIView.animateWithDuration
为我的视图设置了动画,例如:
UIView.animateWithDuration(0.2, animations: { () -> Void in
self.myView.frame = CGRectInset(self.myView.frame, -20, -20);
}) { (done) -> Void in
}
我希望我的视图还可以更新同一动画中图层的cornerRadius(或单独的动画,因为cornerRadius更改不会使用animateWithDuration
进行动画处理。
这是我已经尝试过的:
UIView.animatewithDuration
正在运行但是所有这些结果都会导致结果错误,因为边界尚未更新,或者在完成其他动画之前完成了添加的CALayer的调整大小。我希望它能够顺利过渡。
答案 0 :(得分:3)
func changeBounds()
{
let animation = CABasicAnimation()
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.fromValue = NSValue(CGRect: self.theView.frame)
animation.toValue = NSValue(CGRect: CGRectInset(self.theView.frame, 40, 40))
animation.duration = 1.0
self.theView.layer.addAnimation(animation, forKey: "bounds")
CATransaction.begin()
CATransaction.setDisableActions(true)
self.theView.layer.frame = CGRectInset(self.theView.frame, 40, 40)
CATransaction.commit()
}
func changeCornerRadius()
{
let animation = CABasicAnimation(keyPath:"cornerRadius")
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.fromValue = 0
animation.toValue = self.theView.frame.size.width/2
animation.duration = 1.0
self.theView.layer.addAnimation(animation, forKey: "cornerRadius")
self.theView.layer.cornerRadius = self.theView.frame.size.width/2
}
这似乎对我有用,只需这样打电话。
self.changeBounds()
self.changeCornerRadius()
将动画关键点设置为" bounds"而不是"框架"。或者您可以将这两个动画添加到动画组中。
答案 1 :(得分:0)
您可以使用此扩展来更改角半径的变化。
extension UIView
{
func addCornerRadiusAnimation(from: CGFloat, to: CGFloat, duration: CFTimeInterval)
{
let animation = CABasicAnimation(keyPath:"cornerRadius")
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.fromValue = from
animation.toValue = to
animation.duration = duration
self.layer.addAnimation(animation, forKey: "cornerRadius")
self.layer.cornerRadius = to
}
}