2012-10-09 28 views
0

我需要得到_propArrow(UIImageView的)每.1sec在任何時候的位置和使用的NSLog的方法(無效),以驗證runScheduledTaskXcode中得到的NSTimer對象的位置,每毫秒

,但不工作的每。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){ 

        }]; 



} 

回答

1

因爲在大多數UIKit動畫屬性中,新值從代碼的角度立即設置爲;這是顯示的實際動畫的值。閱讀像UIView.frame這樣的動畫屬性絕對不應該給你一箇中間值(主要的例外是UIScrollView,它爲動畫滾動做了它自己的事情)。

如果你想「大約什麼在屏幕上顯示」,你需要訪問CoreAnimation「表示層」:

#import <QuartzCore/CALayer.h> 

- (void)runScheduledTask { 
    NSLog(@"Position: %@", NSStringFromCGRect(_propArrow.layer.presentationLayer.frame)); 
} 

,如果你想運行的每一幀的回調也可以考慮使用CADisplayLink

+0

作品! 謝謝。這就是我真正期待的=) – Fabio

+0

+1好點。 – Caleb

2

首先,根據NSTimer docs,該類具有約50-100毫秒的有效分辨率。因此,使用它以1毫秒的間隔做任何事情肯定會失敗。

其次,即使能的NSTimer處理1毫秒的間隔,你甚至不要求它做到這一點:

aTimer = [NSTimer scheduledTimerWithTimeInterval:.05...

你的代碼的時間表計時器永遠跑0.05秒,也就是說每50毫秒。第三,屏幕在任何接近1毫秒的時間間隔內都不會更新,所以屏幕上圖像的實際位置變化要小得多。

那麼,你究竟想在這裏完成什麼?如果你想知道在現實世界中連續運動的物體的位置是,那麼你可以計算出在任何時間點。

+0

我怎樣才能得到每毫秒的對象的位置? 有什麼建議嗎? – Fabio

+0

對不起,我在我的問題有一個錯誤而我怎麼能得到的對象的位置每0.1秒? – Fabio

+0

我需要每個.1秒的對象位置Y NSlog ..... 2012-10-08 20:49:50.693 Y:{{144,291},{33,71}} 2012-10-08 20:49:50.793 Y:{{144,291},{33,71}} 2012-10-08 20:49:50.893 Y:{{144,291},{33,71}} 2012年10月20日-08 20:49:50.994 Y:{{144,0},{33,71}} 2012-10-08 20:49:51.093 Y:{{144,0},{33,71}} 2012 -10-08 20:49:51.193 Y:{{144,0},{33,71}} 2012-10-08 20:49:51.293 Y:{{144,0},{33,71}}} – Fabio