有没有办法知道我的自定义实现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中的一个私有方法,我无法访问或更改,因此我必须以某种方式从“外部”确定这一点。
答案 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];
}];