0

UIView を回転させようとしています。この UIView は、時計の秒ポインターを表します。

毎秒更新する必要があります。このような:

- (void)startUpdates {
    _updateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(animatePointer) userInfo:nil repeats:YES];
}

次のように、必要なときに停止します。

- (void)stopUpdates {
    [_updateTimer invalidate];
    _updateTimer = nil;
}

次のように、1 秒ごとに次のようにアニメーション化します。

- (void)animatePointer {

    NSDate *now = [NSDate date];
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSSecondCalendarUnit fromDate:now];

    float angleForSeconds = (float)[components second] / 60.0;

    [UIView animateWithDuration:1.0 animations:^(void){
        _pointerGlow.layer.transform = CATransform3DMakeRotation((M_PI * 2) * angleForSeconds, 0, 0, 1);
    }];

}

これは機能しますが、スムーズではありません。典型的な壁掛け時計のように、毎秒、ほんの一瞬停止します。いいですが、私が目指しているものではありません。

このアニメーションを滑らかにする方法はありますか?

4

1 に答える 1

1

60/秒のディスプレイ リフレッシュ レートに関連付けられている CADisplayLink で試すことができます。コードは次のようになります (表示リンクを停止するロジックは追加していませんが、必要に応じて呼び出すメソッドを追加したことに注意してください)。

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CFTimeInterval firstTimestamp;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self startDisplayLink];
}


- (void)startDisplayLink {
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)stopDisplayLink {
    [self.displayLink invalidate];
    self.displayLink = nil;
}

- (void)handleDisplayLink:(CADisplayLink *)displayLink {
    if (!self.firstTimestamp) self.firstTimestamp = displayLink.timestamp;
    NSTimeInterval elapsed = (displayLink.timestamp - self.firstTimestamp);
    self.arrow.layer.transform = CATransform3DMakeRotation((M_PI * 2) * elapsed/60, 0, 0, 1);
}
于 2013-08-04T01:56:14.030 に答える