簡體   English   中英

使用CADisplayLink的UIImageView旋轉動畫-跟蹤旋轉

[英]UIImageView Rotation Animation using CADisplayLink - Tracking Rotation

建議我嘗試使用CADisplayLink旋轉UIIMageView 我正在使用Storyboard構建此應用程序。

輕按屏幕時,我需要啟動和停止動畫。 我還需要跟蹤點擊屏幕時旋轉停止的角度。

我在這里找到了本教程,但對我沒有幫助。

我還找到了幾個小例子( 這是一個例子),但我無法使其真正動起來。 從上面的示例中我得到的結果是,我的圖像旋轉了一次,然后停止了。

除此之外,我真的找不到如何使用CADisplayLink連續旋轉UIImageView的好教程或示例,直到點擊為止,然后在再次點擊時繼續旋轉並最終存儲旋轉角度。

為了讓您大致了解我要實現的目標,它基本上是一個鍾面,並且隨着鍾針的旋轉,您可以通過點擊來啟動和停止它,並獲取角度。

有誰知道一個好榜樣? 也許可以幫助我。 謝謝。

更新/編輯

在我的應用程序中使用Rob出色的Obj-C答案非常有效。 如果有人感興趣,這就是我跟蹤旋轉角度並將其顯示在屏幕上的方式:

每次調用HandleDisplayLink ,我都會調用此方法: [self calculateDisplayAngle]; HandleDisplayLink [self calculateDisplayAngle];

方法很簡單:

 - (void)calculateDisplayAngle{
         currentRotationAngle = self.percent*360; //360 because I changed kDuration = 1;
         self.AngleLabel.text = [NSString stringWithFormat:@"Angle: %.2f",currentRotationAngle];
 }

您只需要具有可跟蹤旋轉狀態的屬性,以便在停止旋轉時可以從停止的位置開始旋轉。 例如:

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    startDisplayLink()
}

@IBAction func handleTapGesture(sender: UITapGestureRecognizer) {
    if displayLink != nil {
        stopDisplayLink()
    } else {
        startDisplayLink()
    }
}

private let duration = 2.5
private var percent = 0.0
private var displayLink: CADisplayLink?
private var start: CFAbsoluteTime?

func startDisplayLink() {
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
    start = CFAbsoluteTimeGetCurrent() + (1.0 - percent) * duration
    displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
}

func stopDisplayLink() {
    displayLink?.invalidate()
    displayLink = nil
}

func handleDisplayLink(displayLink: CADisplayLink) {
    let elapsed = CFAbsoluteTimeGetCurrent() - start!
    percent = (elapsed % duration) / duration
    imageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI * 2.0 * percent))
}

或在Objective-C中:

static CGFloat const kDuration = 2.5;

@interface ViewController2 ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CFAbsoluteTime startTime;
@property (nonatomic) CGFloat percent;

@end

@implementation ViewController2

- (IBAction)handleTapGesture:(UITapGestureRecognizer *)sender {
    if (self.displayLink) {
        [self stopDisplayLink];
    } else {
        [self startDisplayLink];
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self startDisplayLink];
    // Do any additional setup after loading the view.
}


- (void)startDisplayLink {
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
    self.startTime = CFAbsoluteTimeGetCurrent() + (1.0 - self.percent) * kDuration;
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

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

- (void)handleDisplayLink:(CADisplayLink *)displayLink {
    CFAbsoluteTime elapsed = CFAbsoluteTimeGetCurrent() - self.startTime;
    self.percent = elapsed / kDuration - floor(elapsed / kDuration);
    self.imageView.transform = CGAffineTransformMakeRotation(M_PI * 2.0 * self.percent);
}

@end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM