2

CADisplayLinkを回転させるように勧められましたUIIMageView。Storyboard を使用してこのアプリを作成しています。

画面がタップされたときに、アニメーションを開始および停止する必要があります。画面がタップされたときに回転が停止した角度も追跡する必要があります。

このチュートリアルHEREを見つけましたが、まったく役に立ちません。

また、いくつかの小さな例を見つけました (ここに 1 つ) がありますが、実際にアニメーション化することはできませんでした。上記の例から取ったものから、私の画像は一度回転してから停止しました。

それ以外に、タップするまで継続的にCADisplayLink回転させ、再度タップすると回転し続け、最後に回転角度を保存するための良いチュートリアルや例を見つけることができません。UIImageView

私が何を達成しようとしているのかを理解していただくために、これは基本的に時計の文字盤であり、時計の針が回転すると、タップして開始および停止し、角度を取得できます。

誰か良い例を知っていますか?または多分ここで私を助けることができます。ありがとう。

更新・編集

私のアプリで以下のRobの素晴らしいObj-C回答を使用すると、完全に機能します。誰かが興味を持っている場合に備えて、これは私が回転角度を追跡して画面に表示する方法です:

HandleDisplayLinkが呼び出されるたびに、このメソッドを呼び出しました。[self calculateDisplayAngle];

方法は簡単です:

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

1 に答える 1

3

回転の状態を追跡するためのプロパティを設定するだけで、回転を停止したときに中断したところから再開できます。例えば:

@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
于 2015-12-03T00:08:06.250 に答える