Ios UIImageView旋转动画使用CADisplayLink-跟踪旋转

Ios UIImageView旋转动画使用CADisplayLink-跟踪旋转,ios,uiimageview,rotation,cadisplaylink,Ios,Uiimageview,Rotation,Cadisplaylink,有人建议我尝试CADisplayLink旋转UIIMageView。我正在使用故事板构建此应用程序 当屏幕被点击时,我需要启动和停止动画。我还需要跟踪屏幕被点击时旋转停止的角度 我找到了这个教程,但它对我并没有什么帮助 我还发现了几个小示例(),但我无法让它实际动画化。根据上面的例子,我的图像旋转了一次,然后就停止了 除此之外,我真的找不到一个好的教程或示例来说明如何使用CADisplayLink连续旋转我的UIImageView,直到点击,然后在再次点击时继续旋转,最后存储旋转角度 为了让你了

有人建议我尝试
CADisplayLink
旋转
UIIMageView
。我正在使用故事板构建此应用程序

当屏幕被点击时,我需要启动和停止动画。我还需要跟踪屏幕被点击时旋转停止的角度

我找到了这个教程,但它对我并没有什么帮助

我还发现了几个小示例(),但我无法让它实际动画化。根据上面的例子,我的图像旋转了一次,然后就停止了

除此之外,我真的找不到一个好的教程或示例来说明如何使用
CADisplayLink
连续旋转我的
UIImageView
,直到点击,然后在再次点击时继续旋转,最后存储旋转角度

为了让你了解我想要实现的目标,它基本上是一个时钟面,当时钟指针旋转时,你可以通过敲击来启动和停止它,并获取角度

有人知道一个好例子吗?或者也许可以帮我。谢谢

更新/编辑

在我的应用程序中使用下面罗布令人敬畏的Obj-C答案,效果非常好。 如果有人感兴趣,这就是我跟踪旋转角度并将其显示在屏幕上的方式:

每次调用
HandleDisplayLink
时,我都调用这个方法:
[self-calculatedisplaylange]

方法很简单:

 - (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

看起来有道理。它也是如此。每2.5秒360度旋转?无限旋转直到停止?如果我的UIImageView位于我的故事板上并链接到我的
.h
,这会起作用吗?对不起,这是我第一次做这种事。另外,我以前在这个上下文中没有见过问号语法。现在很晚了,所以我明天会好好看看。哦,等等,这是斯威夫特吗?哦,我为此道歉。谢谢你花时间来发帖,我真的很感激。明天我会把它翻译成ObjC,翻译很简单。见上面修改的答案。非常感谢。我迫不及待地想明天试一试(这里快凌晨1点了)。我会让你知道事情的进展。