UIView animateWithDuration不会animationcornerRadius变体

我正在尝试animationUIView实例layercornerRadius的变化,但cornerRadius的变化立即发生。

代码如下:

 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)]; view.layer.masksToBounds = YES; view.layer.cornerRadius = 10.0; [UIView animateWithDuration:1.0 animations:^{ [view.layer.cornerRadius = 0.0; }]; 

谢谢大家谁给我任何提示。

编辑:

我设法使用Core Animation ,使用CABasicAnimationanimation这个属性。

 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"]; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; animation.fromValue = [NSNumber numberWithFloat:10.0f]; animation.toValue = [NSNumber numberWithFloat:0.0f]; animation.duration = 1.0; [viewToAnimate.layer addAnimation:animation forKey:@"cornerRadius"]; [animation.layer setCornerRadius:0.0]; 

tl; dr:animateWithDuration:animations:angular点半径不是可以animation的animateWithDuration:animations:


文档中关于视图animation的说法。

正如在“视图编程指南iOS”中的animation部分所说的

UIKit和Core Animation都支持animation,但每种技术提供的支持水平都不相同。 在UIKit中,animation是使用UIView对象执行的

您可以使用较老的属性完整列表

 [UIView beginAnimations:context:]; [UIView setAnimationDuration:]; // Change properties here... [UIView commitAnimations]; 

或更新

 [UIView animateWithDuration:animations:]; 

(你正在使用)是:

  • 界限
  • 中央
  • 转换(CGAffineTransform,而不是CATransform3D)
  • α
  • 背景颜色
  • contentStretch

正如你所看到的, cornerRadius不在列表中。

有些困惑

UIViewanimation实际上只是用于animation视图属性。 令人迷惑的是,你也可以在UIViewanimation块内的图层上设置相同的属性,即框架,边界,位置,不透明度,背景颜色。 所以人们在animateWithDuration里面看到了图层animation,相信他们可以在那里animation任何视图属性。

同一部分继续说:

在你想要执行更复杂的animation或者UIView类不支持的animation的地方,你可以使用Core Animation和视图的底层来创buildanimation。 由于视图和图层对象错综复杂地链接在一起,因此对视图图层的更改会影响视图本身。

下面几行你可以阅读核心animationanimation属性的列表,你看到这个:

  • 图层的边框(包括图层的边angular是否圆整)

所以为了创buildcornerRadiusanimation,你需要使用Core Animation,就像你在更新的问题(和答案)中已经说过的那样。 我只是试图解释为什么如此。


一些额外的澄清

当人们阅读那些说animateWithDuration是推荐的animation方式的文档时,很容易相信它正在试图取代CABasicAnimation,CAAnimationGroup,CAKeyframeAnimation等,但实际上并不是。 它取代你在上面看到的beginAnimations:context:commitAnimations

我使用这个扩展来改变angular部半径的变化:

 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 layer.add(animation, forKey: "cornerRadius") layer.cornerRadius = to } } 

angular落半径变化可以animation,但唯一的方法是使用CABasicAnimation。 希望这可以帮助那里的人。

你可以在这里实现UIViewanimation: http : //maniacdev.com/2013/02/ios-uiview-category-allowing-you-to-set-up-customizable-animation-properties

 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"]; animation.duration = DURATION; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; animation.toValue = @(NEW_CORNER_RADIUS); animation.fillMode = kCAFillModeForwards; animation.removedOnCompletion = NO; [view.layer addAnimation:animation forKey:@"setCornerRadius:"]; 

你可以通过在你的视图类中实现-[actionForLayer:forKey]来使得这个属性在+[UIView animateWithDuration:]animation。 看到这个问题的例子如何。