这是我的代码
- (void)viewDidLoad {
[super viewDidLoad];
self.timer = [NSTimer scheduledTimerWithTimeInterval:3.f target:self selector:@selector(creatButton) userInfo:nil repeats:YES];
}
- (NSMutableArray *)buttonsArray {
if (!_buttonsArray) {
_buttonsArray = [[NSMutableArray alloc] init];
}
return _buttonsArray;
}
- (void)creatButton {
NSInteger j = arc4random() % 250;
UIButton *countButton = [[UIButton alloc] initWithFrame:CGRectMake((j * 20) % ((NSInteger)self.view.frame.size.width - 120), -300, 100, 50)];
[self.buttonsArray addObject:countButton];
[self.view addSubview:countButton];
[UIView animateWithDuration:9 delay:0.f
options:(UIViewAnimationOptionCurveLinear)
animations:^{
countButton.center = CGPointMake(50 + (j * 20) % ((NSInteger)self.view.frame.size.width - 120), self.view.frame.size.height);
}
completion:nil];
}
我希望知道在动画“飞行中”时有任何方法可以获得countButton
的位置。
答案 0 :(得分:3)
在UIKit / CoreAnimation中配置视图动画的方式,一旦调用动画块,视图的属性就会设置为最终值,因此读取counterButton.center
只会返回最终值。同样,图层的属性可能固定在最终值(尽管不是严格必要)。
您可以使用视图的图层表示层[countButton.layer presentationLayer]
来获取图层在屏幕上显示的属性的近似快照。
<强>声明强>
- (instancetype)presentationLayer;
返回值
当前表示层对象的副本。
<强>讨论强>
此方法返回的图层对象为 提供了当前在屏幕上显示 的图层的近似值。当动画正在进行时,您可以检索此对象并使用它来获取这些动画的当前值。
默认情况下,视图的中心与view.layer.position
相同,因此您可以通过以下方式获取按钮的动画中心:
[countButton.layer presentationLayer].position
答案 1 :(得分:1)
James Baxter的回答是正确的方法。您需要查询正在设置动画的presentationLayer。
请注意,UIView动画在封面下使用CAAnimations,因此可以通过相同的方式查询被UIView动画制作动画的视图的位置。
我在Github上有一个名为iOS-CAAnimation-group-demo的演示项目,演示了许多技术,包括&#34;命中测试&#34;在飞行中的UIView和CAAnimation动画,这样您就可以点击动画暂停/恢复动画的图像。它是用Objective-C编写的,但它看起来像你想要的,所以它应该有用。