更改 UIView 的框架并更新cornerRadius
Posted
技术标签:
【中文标题】更改 UIView 的框架并更新cornerRadius【英文标题】:Change the frame of an UIView and update cornerRadius 【发布时间】:2014-12-19 14:19:39 【问题描述】:在我的应用程序中,我使用UIView
子类来显示各种信息。我希望这些视图显示为圆形,因此我将视图 layer
上的 cornerRadius
设置为 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
进行动画处理。
这是我已经尝试过的:
子类化 CALayer,它会绘制一个圆圈并将其放在 MyView.layer 的顶部。 在UIView.animatewithDuration
运行时执行 CABasicAnimation
但所有这些都导致了错误的结果,因为边界尚未更新,或者添加的 CALayer 的大小调整是在其他动画完成之前完成的。我希望它是一个平稳的过渡。
【问题讨论】:
尝试设置视图的“clip to bound” = Yes UIView animateWithDuration doesn't animate cornerRadius variation 的可能重复项 【参考方案1】: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()
将动画键设置为“边界”而不是“帧”。或者您可以将这两个动画添加到一个动画组中。
【讨论】:
【参考方案2】:您可以使用此扩展程序为拐角半径变化设置动画。
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
【讨论】:
以上是关于更改 UIView 的框架并更新cornerRadius的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 运行时更改自动布局约束的 UIView 的框架