UIView 使用自定义属性有条件地为子视图设置动画

Posted

技术标签:

【中文标题】UIView 使用自定义属性有条件地为子视图设置动画【英文标题】:UIView animating subviews conditionally using custom property 【发布时间】:2014-08-08 10:55:30 【问题描述】:

我有两个子视图 - 滚动视图,其内容偏移量是使用父视图上的一个 (CGFloat)属性 有条件地设置的。我想对此属性的更改进行动画处理,以使动画流畅。 我遇到的问题是当我使用

[UIView animateWithDuration:...
              ...
              animations:^
 self.property = x;

动画确实发生了,但是两个滚动视图是独立动画的,并且不遵循在 setter 中触发的 property 设置的规则(递归调用在一个滚动视图和另一个滚动视图上设置偏移量等) ..)。

我尝试使用自定义 CALayer,将一个属性链接到自定义视图的 property 并使用 CoreAnimation 为该属性设置动画,其中动画 keyPath 是该属性。我覆盖了

+(BOOL)needsDisplayForKey:(NSString *) key

因此,没有任何动画。 有什么方法可以为我的属性设置动画,以使结果是一个流畅的动画?

编辑:我知道这可以通过使用计时器和做一些数学运算来完成(对于动画的计时器功能的效果,例如“缓出”),但我猜可能会有更优雅的解决方案和更可重用的解决方案(使用不同的定时器功能等)。

【问题讨论】:

【参考方案1】:

您的财产是什么类型或等级?您不太可能使用带有持续时间的动画来增加任何基本类型,您最好使用 for 循环并自己增加它。

【讨论】:

【参考方案2】:

我最后使用了 CADisplayLink 来持续更新属性值,并使用缓动函数计算更新差异以实现缓出效果。

【讨论】:

以上是关于UIView 使用自定义属性有条件地为子视图设置动画的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIView(.xib) 在 UITableViewCell 中添加为子视图后自动更改框架

如何在 Swift 中将内容包装为自定义视图

根据内容自动设置自定义 UIView 的高度?

使用自动布局将自定义 UIView 绘制为背景并将其居中

故事板约束不影响自定义 UiView 大小

Objective C - 从视图控制器设置 UIView 子类的标签属性