用动画重绘 UIView

Posted

技术标签:

【中文标题】用动画重绘 UIView【英文标题】:Redrawing a UIView with animation 【发布时间】:2013-05-29 17:29:04 【问题描述】:

我是一个新手 ios 程序员,我正在做我的第一个 ios 项目。在我的项目中,我有几个UIViewUIViewController。在每个视图中,我都覆盖了drawRect 方法并绘制了几个圆圈。在我的一个视图中,我需要绘制一个矩形,当我触摸它时,它会在其下方绘制另外 3 个带有动画的矩形。我想知道最好的方法是什么!我正在考虑通过调用setNeedsDisplay 在触摸后重绘视图并用动画绘制其他三个矩形。我怎样才能做到这一点,还有什么方法可以最好地用动画来执行这个特定的事情?

【问题讨论】:

【参考方案1】:

覆盖 drawRect 可能不是您的最佳解决方案,因为要完成多种类型的动画,您需要在计时器下多次重绘。除此之外,您的绘图将使用 CPU 完成,您将无法利用任何硬件加速。

我建议在三个新矩形可见之前,将三个 UIView 添加到视图层次结构中这些矩形应该在的位置。将每个视图的 backgroundColor 属性设置为您想要的矩形颜色,并将每个视图的 alpha 值设置为 0。当需要将矩形动画化到视图中时,您可以使用如下代码:

[UIView animateWithDuration:0.2 animations:^
    rectView1.alpha = 1.0;
    rectView2.alpha = 1.0;
    rectView3.alpha = 1.0;
];

当然可以根据您的应用程序更改动画的持续时间,您也可以更改 rectViews 的其他属性。假设您希望矩形淡入从侧面飞入。您可以通过在动画之前调整每个 rectView 的 frame 属性来实现这一点,然后在动画块内进行调整。

【讨论】:

很好的解决方案。但我有一些问题..*在这种情况下我应该使用setneedsdisplay 吗?在哪里可以声明这三个uiview 而不会在第一次加载整个视图时被调用 当你想用drawRect强制一个视图重绘时你需要调用setNeedsDisplay,但是如果你只是在操作视图的子视图那么你不需要需要导致父视图重绘,实际上调用 setNeedsDisplay 可能只会损害程序的性能。

以上是关于用动画重绘 UIView的主要内容,如果未能解决你的问题,请参考以下文章

检测 UIView/UILabel 何时重绘自身?

UIView 实时强制重绘(绘图应用)

在缩放/变换上强制重绘 UIView 或 CALayer

自定义 UIView 重绘视图控制器

用线程间隔重绘视图

高 CPU 负载延迟 UIView 重绘(iOS)