0

常に.1秒ごとに_propArrow(UIImageView)の位置を取得し、NSLogを使用してメソッド(void)runScheduledTaskで確認する必要があります

ただし、0.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){

                     }];



}
4

2 に答える 2

2

まず、NSTimer のドキュメントによると、そのクラスの実効解像度は約 50 ~ 100 ミリ秒です。したがって、それを使用して 1 ミリ秒間隔で何かを行うと、必ず失敗します。

第二に、たとえ NSTimer が 1 ミリ秒間隔を処理できたとしても、それを行うように要求していません:

aTimer = [NSTimer scheduledTimerWithTimeInterval:.05...

コードは、タイマーが 0.05 秒ごと、つまり 50 ミリ秒ごとに実行されるようにスケジュールします。

第 3 に、画面は 1 ミリ秒間隔で更新されないため、画面上の画像の実際の位置はそれよりもはるかに少ない頻度で変更されます。

では、ここで何を達成しようとしているのでしょうか。オブジェクト連続的な動きで現実世界のどこにあるかを知りたい場合は、任意の時点でそれを計算できます。

于 2012-10-09T01:14:03.010 に答える
1

ほとんどのUIKitアニメーションプロパティでは、コードの観点から新しい値がすぐに設定されるためです。実際にアニメーション化するのは表示された値です。のようなアニメーション化可能なプロパティを読み取るUIView.frameと、中間値が得られることはありません(主な例外は、アニメーション化されたスクロールに対して独自の機能を実行するUIScrollViewです)。

「画面に表示されているものとほぼ同じ」が必要な場合は、CoreAnimationの「プレゼンテーション層」にアクセスする必要があります。

#import <QuartzCore/CALayer.h>

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

またCADisplayLink、すべてのフレームを実行するコールバックが必要な場合は、の使用を検討してください。

于 2012-10-09T01:51:22.163 に答える