我subclassed UIView。它的一些子视图是动画的。什么是重新启动这些的正确方法?

问题描述:

好吧,所以我分类UIView和视图有一堆子视图。这些子视图具有动画效果。当我推动另一个视图控制器顶部,或应用程序进入后台,动画停止。我subclassed UIView。它的一些子视图是动画的。什么是重新启动这些的正确方法?

什么是在我的子视图中重新启动这些动画的正确方法。我不希望View Controller告诉View重新启动它们,因为我觉得View应该知道什么时候需要重新启动而不需要被另一个对象明确告知。

但我不能在子类UIView上使用layoutSubviews,因为正在发生的动画正在添加新的UIImageView。当发生这种情况时,layoutSubviews在UIView子类上被调用。所以layoutSubviews被称为很多,我不能用它来重新启动动画。

想法?

更新 - 动画代码看起来像这样...但我不认为这真的很重要。

[UIView animateWithDuration:ANIMATION_DURATION delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{ 
    [subview setFrame:finalFrame]; 
} completion:^(BOOL finished) { 
    [subview removeFromSuperview]; 
}]; 
+0

你能张贴一些代码来说明你的问题吗?具体来说,你是如何做动画的('+ [UIView animate ...]调用,也许?),你的'-layoutSubviews'做了什么? – Tim 2013-03-23 00:55:12

+0

您可以通过view.superview!= nil检查视图是否可见,并开始动画。 – user523234 2013-03-23 01:38:14

+0

视图总是有一个超视图。我想要一个优雅的方式来触发重启。 – perezda 2013-03-23 23:04:44

使用NSNotificationCenter通知视图,视图控制器已经再次出现像这样:

在你的UIView,添加这个在init方法:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodToExecuteWhenUIViewControllerComesBackUp:) name:@"Came Back" object:nil]; 

然后在你的“其他viewController“中,在您再次展示原始控制器的方法中,添加:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Came Back" object:nil]; 

然后,当您将原始viewController返回时,您的UIView将被通知。为每个要恢复的子视图重复第一段代码。

当任何一个子视图被删除(释放)内存确保执行:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

如果不执行上面的代码中,通知中心会尽量通知不再存在的对象,从而导致你的应用程序坠毁。

+0

我可以做这样的事情,但我真的不想把这段代码放在视图控制器中。我觉得视图应该能够根据需要处理自己。明白我的意思了吗? – perezda 2013-03-23 14:25:51

+0

我明白了,但UIView并不是简单地“知道”什么时候重新开始......这段代码是相对轻量级的,我真的不知道为什么你不能插入代码,告诉我它是否是一个特定的原因。 – virindh 2013-03-23 19:00:39

+0

是的,我可能会诉诸使用这样的事情。我希望有一个优雅的方式。它不觉得优雅,因为我需要在视图上公开一个方法来重新启动动画并从视图控制器中的两个位置调用它。那么当我在其他地方使用这个视图时,我需要做同样的事情。我当然可以做到,似乎有更好的办法。 layoutSubviews几乎可以工作......除了部分动画添加新的子视图,这会触发layoutSubviews。所以我不能。哦,好吧,也许我现在就解决了,继续前进。 – perezda 2013-03-23 23:07:28

不要使用UIView Animation,你最好使用Core Animation

CAAnimation它具有一个名为removedOnCompletion属性设置成默认YES其设置为NOyourCAAnimation.removedOnCompletion = NO;)它会让你的应用程序从background到​​,动画也animated

苹果说:

removedOnCompletion

Determines if the animation is removed from the target layer’s animations upon completion. 

@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion 
Discussion 
When YES, the animation is removed from the target layer’s animations once its active duration has passed. Defaults to YES. 

Availability 
Available in iOS 2.0 and later. 
Related Sample Code 
MoveMe 
Declared In 
CAAnimation.h 
+0

它听起来不像removedOnCompletion会帮助我。视图离开前景时停止动画,而不是当它们完成时停止。虽然他们也这样做。似乎这不会帮助我。 – perezda 2013-03-23 23:09:27