Xcode NSTimer每毫秒获取位置对象

时间:2012-10-09 01:08:47

标签: iphone ios xcode nstimer

我需要始终每隔.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){

                     }];



}

2 个答案:

答案 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