iOS,如何用 animateWithDuration 替换简单的 UIView 图形实例?
Posted
技术标签:
【中文标题】iOS,如何用 animateWithDuration 替换简单的 UIView 图形实例?【英文标题】:iOS, How to alternate simple UIView instances of graphics with animateWithDuration? 【发布时间】:2014-03-16 22:37:40 【问题描述】:我不确定如何继续。我想为轻微的图形变化制作动画。我需要每 2 秒循环一次。
我在 drawrect 方法的一个类中有一些绘图代码。我使用自定义方法 initWithFrame 传入样式参数。
在我的动画 animateWithDuration 块中,我想我可以先 removeFromSuperview 然后 addSubview 不同样式的实例。
我知道这听起来像是错误的方法。
但是,我不知道该怎么做。
谁能给我一些选择/举个例子?
【问题讨论】:
在超级视图中添加和删除不是动画案例。您可以使用 alpha 属性将其淡入/淡出。一旦第一个视图完成淡出,将其从超级视图中删除并添加第二个并开始淡入。 @krafter 你不能用animateWithDuration
为它制作动画,但transitionWithView
可以为添加或删除子视图制作动画,如果你想这样做的话。
如果您只想每 2 秒调用一次 drawRect:
,然后使用 scheduledTimerWithTimeInterval:::::
方法创建一个 NSTimer
。在视图上的计时器处理程序中调用setNeedsDisplay
。
【参考方案1】:
关于您是否应该删除并重新添加视图的原始问题,通常您不会这样做(因为这有点低效)。我通常在我的自定义视图中有一个公共属性,(a)视图控制器可以设置;并且 (b) 由 drawRect
方法使用。然后我实现了一个自定义设置器,它不仅保存支持属性的 ivar,而且还调用 setNeedsDisplay
(这将触发 drawRect
为你调用)。
您还没有描述视图中发生了什么变化,但让我给您一个随机示例。假设您有一个drawRect
,它绘制了一个给定radius
的圆圈。那么我的UIView
子类可能有这个CGFloat
的属性,例如:
@property (nonatomic) CGFloat radius;
然后我可能会实现一个自定义设置器,它不仅会像往常一样更新 ivar,还会触发drawRect
的重新调用:
- (void) setRadius:(CGFloat)newRadius
_radius = newRadius; //note, I set the ivar backing the property; do not try self.radius = ..., because that will call this same method with infinite recursion
[self setNeedsDisplay];
然后,当我的视图控制器想要更新视图时,它可以简单地执行以下操作:
customView.radius = 27.5;
或者,如果我想每两秒对它的变化进行动画处理,每两秒淡入新位置,我会将此属性的变化包装在 transitionWithView
块中:
[UIView transitionWithView:customView
duration:0.3
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
customView.radius = 27.5;
completion:nil];
现在,显然这是一个随机示例,其中此属性是 CGFloat
,但您可以使用您的 drawRect
需要反映屏幕的新渲染的任何自定义属性来执行此操作。
【讨论】:
以上是关于iOS,如何用 animateWithDuration 替换简单的 UIView 图形实例?的主要内容,如果未能解决你的问题,请参考以下文章
iOS,如何用 animateWithDuration 替换简单的 UIView 图形实例?