如何知道视图是否正在动画?

时间:2014-06-12 22:05:08

标签: ios objective-c animation uiview uikit

有没有办法知道我的自定义实现setFrame:(或动画属性的其他设置者)是否从动画块中调用,即它是动画还是直接设置?

示例:

- (void)setFrame:(CGRect)newFrame {
    [super setFrame:newFrame];
    BOOL willBeAnimated = ?????
    if (willBeAnimated) {
        // do something 
    } else {
        // do something else
    }
}

在上面的setter willBeAnimated应该是YES,它的调用方式如下:

- (void)someMethod {
    [UIView animateWithDuration:0.2 
                     animations:^{view.frame = someRect;}
                     completion:nil];
}
在这种情况下,

NO

- (void)someMethod {
    view.frame = someRect;
}

someMethod这里是UIKit中的一个私有方法,我无法访问或更改,因此我必须以某种方式从“外部”确定这一点。

1 个答案:

答案 0 :(得分:2)

您应该可以在更改框架后立即检查animationKeys子类layer的{​​{1}},看看它是否正在设置动画。

UIView

您还可以使用- (void)setFrame:(CGRect)newFrame { [super setFrame:newFrame]; BOOL willBeAnimated = [super.layer animationForKey:@"position"] ? YES : NO; if (willBeAnimated) { // do something } else { // do something else } } 检查是否有任何动画,在这种情况下只会返回animationsKeys

此外,如果您想强制更改为不动画,可以使用position

performWithoutAnimation:

修改

我通过测试发现的另一个小问题是,如果动画已经在进行中,您可以实际停止动画,而是通过从图层中移除动画然后使用上述方法立即进行更改。

 [UIView performWithoutAnimation:^{
        [super setFrame:newFrame];
    }];