gpt4 book ai didi

ios - 如何知道 View 是否正在动画?

转载 作者:行者123 更新时间:2023-11-29 10:41:47 40 4
gpt4 key购买 nike

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

例子:

- (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 内部的一个私有(private)方法,我无法访问或更改,所以我必须以某种方式从“外部”确定它。

最佳答案

您应该能够在更改框架后立即检查 UIView 子类的 layeranimationKeys 以查看它是否被动画。

- (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];
}];

编辑

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

- (void)setFrame:(CGRect)newFrame {
[super setFrame:newFrame];
BOOL willBeAnimated = [super.layer animationForKey:@"position"] ? YES : NO;
BOOL shouldBeAnimated = // decide if you want to cancel the animation
if (willBeAnimated && !shouldBeAnimated) {
[super removeAnimationForKey:@"position"];
[UIView performWithoutAnimation:^{
[super setFrame:newFrame];
}];
} else {
// do something else
}
}

关于ios - 如何知道 View 是否正在动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194649/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com