动画 UIView setFrame 在每个动画帧上强制 drawRect

Posted

技术标签:

【中文标题】动画 UIView setFrame 在每个动画帧上强制 drawRect【英文标题】:Animate UIView setFrame to force drawRect on each animatable frame 【发布时间】:2013-12-28 12:07:26 【问题描述】:

我有一个顶部带有 UILabel 的 UIView。我将 UILabel 的内容模式设置为“UIContentModeLeft”。正如预期的那样,当我将 UIView 的帧设置为小于原始大小时,标签会“跳转”到最终帧,而不会很好地设置动画。

据我所知,UIContentModeRedraw 不会强制在每个“动画帧”上调用“drawRect”。我也尝试过使用自定义 CALayer,但似乎无法使框架顺利调整大小。

有没有办法做到这一点?目前的动画非常有问题。 UIContentModes 没有用,我不能为 contentStretch 使用框架,并且标签的任何边缘都不能被拉伸。我真正需要的是每次父视图调整大小时“刷新”标签。

【问题讨论】:

我脑补一下,你有没有研究过关键帧动画的方法?您可能会获得更好的粒度和控制。 不,这本质上是一样的——因为它在内部使用了一个presentationLayer来执行实际的动画,并且UIViewContentMode仍然有效。唯一的似乎是一个基于 NSTimer 的动画(所以我在每个触发的时间间隔上显式调用 setFrame),但这是滞后和丑陋的。 【参考方案1】:

不幸的是,没有办法做到这一点,所以我学会了。唯一的另一种方法是实际运行一个计时器,每次调用它都会更新帧。鉴于调整复杂视图的大小非常耗时,这会导致动画非常生涩。我最终通过一些预渲染的屏幕元素和幕后的大量“神奇效果”实现了同样的效果。

【讨论】:

以上是关于动画 UIView setFrame 在每个动画帧上强制 drawRect的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIView 关键帧动画设置动画曲线(`func UIView.animateKeyframes()`)

UIView 帧动画“摆动”

ImageView 的 UIView 动画帧

如何在 Papervision 中将动画 DAE 对象设置为特定帧

使用图像为 UIView 的位置和大小设置动画的正确方法(此方法在 Xcode 6 中中断)?

使用自动调整子视图大小为 UIView 帧大小更改动画