我有一个UIView与子视图,并希望只动画某些视图的特定属性。例如,我有时想调用[self layoutIfNeeded]
,并且只对边界进行动画处理,而不是视图或其子视图的其他属性。范围UIView动画到特定的视图或属性
问题是+[UIView animateWithDuration:animations]
跟踪子视图和所有动画属性。有没有合理的解决方案?
我有一个UIView与子视图,并希望只动画某些视图的特定属性。例如,我有时想调用[self layoutIfNeeded]
,并且只对边界进行动画处理,而不是视图或其子视图的其他属性。范围UIView动画到特定的视图或属性
问题是+[UIView animateWithDuration:animations]
跟踪子视图和所有动画属性。有没有合理的解决方案?
看看+[UIView performWithoutAnimation:]
。您可以指定一组您希望在没有动画的情况下执行的更改,并立即执行。
这适用于iOS7及以上版本,并且仅适用于UIKit动画。对于直接在层对象的动画,或支持用于处理旧版iOS,您可以使用下面的代码:
[CATransaction begin];
[CATransaction setDisableActions:YES];
//Perform any changes that you do not want to be animated
[CATransaction commit];
更多关于performWithoutAnimation:
here和setDisabledActions:
here。
如果您不希望改变父母的代码,你可以实现你不希望动画属性的setter方法,并与performWithoutAnimation:
包裹超级调用,就像这样:
- (void)setFrame:(CGRect)frame
{
[UIView performWithoutAnimation:^{
[super setFrame:frame];
}];
}
如果您不希望子视图在父视图边界更改时调整大小,则应该适当地设置每个子视图autoresizingMask
和/或设置父级的autoresizesSubviews
标志。
否则,您必须覆盖父项的layoutSubviews
并将每个子视图的框架修改为其先前的值。
既然你想做一些比移动视图更复杂的东西,我绝对建议你从UIKit降级到Core Animation。这将允许您为每个对象的特定键路径创建动画。
我保证没有那么可怕,通过创建一些CABasicAnimations并将它们组合在CAAnimationGroup中,您可以将它们添加到任何UIView的CALayer中。这肯定会提供您需要的控制。
有没有一种方法来启用/禁用动画的特定属性?例如,'[self layoutIfNeeded]'改变了视图的框架,但也改变了它的子视图的框架。我想告诉UIKit只动画父视图,而不动画子视图,而不修改父视图的实现。 – ide
@ide您可以修改'setXXX:'的子视图实现,将其包含在'performWithoutAnimation:'块中。请参阅编辑以回答。 –