2014-03-25 26 views
7

我有一个UIView与子视图,并希望只动画某些视图的特定属性。例如,我有时想调用[self layoutIfNeeded],并且只对边界进行动画处理,而不是视图或其子视图的其他属性。范围UIView动画到特定的视图或属性

问题是+[UIView animateWithDuration:animations]跟踪子视图和所有动画属性。有没有合理的解决方案?

回答

10

看看+[UIView performWithoutAnimation:]。您可以指定一组您希望在没有动画的情况下执行的更改,并立即执行。

这适用于iOS7及以上版本,并且仅适用于UIKit动画。对于直接在层对象的动画,或支持用于处理旧版iOS,您可以使用下面的代码:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
//Perform any changes that you do not want to be animated 
[CATransaction commit]; 

更多关于performWithoutAnimation:heresetDisabledActions:here


如果您不希望改变父母的代码,你可以实现你不希望动画属性的setter方法,并与performWithoutAnimation:包裹超级调用,就像这样:

- (void)setFrame:(CGRect)frame 
{ 
    [UIView performWithoutAnimation:^{ 
     [super setFrame:frame]; 
    }]; 
} 
+0

有没有一种方法来启用/禁用动画的特定属性?例如,'[self layoutIfNeeded]'改变了视图的框架,但也改变了它的子视图的框架。我想告诉UIKit只动画父视图,而不动画子视图,而不修改父视图的实现。 – ide

+0

@ide您可以修改'setXXX:'的子视图实现,将其包含在'performWithoutAnimation:'块中。请参阅编辑以回答。 –

1

如果您不希望子视图在父视图边界更改时调整大小,则应该适当地设置每个子视图autoresizingMask和/或设置父级的autoresizesSubviews标志。

否则,您必须覆盖父项的layoutSubviews并将每个子视图的框架修改为其先前的值。

1

既然你想做一些比移动视图更复杂的东西,我绝对建议你从UIKit降级到Core Animation。这将允许您为每个对象的特定键路径创建动画。

我保证没有那么可怕,通过创建一些CABasicAnimations并将它们组合在CAAnimationGroup中,您可以将它们添加到任何UIView的CALayer中。这肯定会提供您需要的控制。