我需要始终每隔.1秒获取_propArrow(UIImageView)的位置,并使用NSLog在方法中验证(void)runScheduledTask
但不会每隔.1秒运行一次。
仅指示动画移动的开始和结束
这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
_propArrow.frame = CGRectMake(144, 291, 33, 71);
aTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(runScheduledTask) userInfo:nil repeats:YES];
}
- (void)runScheduledTask {
NSLog(@"Position: %@", NSStringFromCGRect(_propArrow.frame));
}
- (IBAction)fire:(id)sender {
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
_propArrow.frame = CGRectMake(144, 0, 33, 71);
}
completion:^(BOOL finished){
}];
}
答案 0 :(得分:2)
首先,根据NSTimer docs,,该类的有效分辨率约为50-100毫秒。因此,使用它以1 ms的间隔执行任何操作都将失败。
其次,即使NSTimer可以处理1毫秒的间隔,你甚至不会要求它这样做:
aTimer = [NSTimer scheduledTimerWithTimeInterval:.05...
您的代码安排计时器运行0.05秒,也就是说每50毫秒运行一次。
第三,屏幕不会以接近1毫秒的间隔更新,因此图像在屏幕上的实际位置变化的频率会低于此值。
那么,你究竟想在这里完成什么?如果你想通过连续运动知道现实世界中对象的位置,你可以计算出任何时间点。
答案 1 :(得分:1)
因为在大多数UIKit动画属性中,新值从代码的角度立即设置 ;它实际上是显示的值。读取像UIView.frame
这样的可动画属性永远不应该给你一个中间值(主要的例外是UIScrollView,它为动画滚动做了自己的事情)。
如果你想要"大约在屏幕上显示什么",你需要访问CoreAnimation"表示层":
#import <QuartzCore/CALayer.h>
- (void)runScheduledTask {
NSLog(@"Position: %@", NSStringFromCGRect(_propArrow.layer.presentationLayer.frame));
}
如果您想要每帧运行一次回调,请考虑使用CADisplayLink
。