如何在动画期间获得UIButton位置

时间:2017-05-02 22:02:22

标签: ios objective-c

这是我的代码

- (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的位置。

2 个答案:

答案 0 :(得分:3)

在UIKit / CoreAnimation中配置视图动画的方式,一旦调用动画块,视图的属性就会设置为最终值,因此读取counterButton.center只会返回最终值。同样,图层的属性可能固定在最终值(尽管不是严格必要)。

您可以使用视图的图层表示层[countButton.layer presentationLayer]来获取图层在屏幕上显示的属性的近似快照。

From Apple, emphasis added

  

<强>声明

- (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编写的,但它看起来像你想要的,所以它应该有用。