gpt4 book ai didi

ios - UIView animateWithDuration 不会对cornerRadius变化进行动画处理

转载 作者:行者123 更新时间:2023-12-03 05:38:31 25 4
gpt4 key购买 nike

我正在尝试对 UIView 实例 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 AnimationCABasicAnimation为该属性设置动画。

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: 中不可设置动画。

<小时/>

文档中有关 View 动画的说明。

作为section on Animations在“查看 iOS 编程指南”中说

Both UIKit and Core Animation provide support for animations, but the level of support provided by each technology varies. In UIKit, animations are performed using UIView objects

属性的完整列表,您可以使用旧版本进行动画处理

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

或较新的

[UIView animateWithDuration:animations:];

(您正在使用的)是:

  • 框架
  • 界限
  • 居中
  • 变换(CGAffineTransform,而不是 CATransform3D)
  • 阿尔法
  • 背景颜色
  • 内容拉伸(stretch)

如您所见,cornerRadius 不在列表中。

有些困惑

UIView 动画实际上仅用于动画 View 属性。令人困惑的是,您还可以对 UIView 动画 block 内的图层上的相同属性进行动画处理,即框架、边界、位置、不透明度、背景颜色。因此,人们在 animateWithDuration 中看到图层动画,并相信他们可以为其中的任何 View 属性设置动画。

同一部分接着说:

In places where you want to perform more sophisticated animations, or animations not supported by the UIView class, you can use Core Animation and the view’s underlying layer to create the animation. Because view and layer objects are intricately linked together, changes to a view’s layer affect the view itself.

往下几行,您可以阅读核心动画可动画属性列表,您可以在其中看到以下属性:

  • The layer’s border (including whether the layer’s corners are rounded)

因此,要为 cornerRadius 制作动画,您需要使用核心动画,正如您在更新的问题(和答案)中已经说过的那样。我刚刚添加尝试解释为什么会这样。

<小时/>

一些额外的说明

当人们阅读说明 animateWithDuration 是推荐的动画方式的文档时,很容易相信它正在尝试取代 CABasicAnimation、CAAnimationGroup、CAKeyframeAnimation 等,但事实并非如此。它取代了您在上面看到的 beginAnimations:context:commitAnimations

关于ios - UIView animateWithDuration 不会对cornerRadius变化进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5948167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com