2015-12-02 2 views
1

Мне рекомендуется попробовать CADisplayLink, чтобы повернуть UIIMageView. Я создаю это приложение с помощью раскадровки.UIImageView Вращение анимации с использованием CADisplayLink - Отслеживание вращения

Мне нужно запустить и остановить анимацию, когда экран прослушивается. Мне также нужно отслеживать угол, при котором вращение останавливалось при прослушивании экрана.

Я нашел этот учебник HERE, но это не совсем полезно для меня.

Я также нашел несколько небольших примеров (here's one), но я не мог получить его на самом деле. Из того, что я взял из приведенного выше примера, мое изображение повернуло один раз, а затем просто остановилось.

Другое, что я действительно не могу найти хороший учебник или пример того, как использовать CADisplayLink, чтобы повернуть мой UIImageView непрерывно, до тех пор, пока он не постукивается, а затем продолжайте вращаться при повторном нажатии и, наконец, сохраняя угол поворота.

Чтобы дать вам представление о том, чего я пытаюсь достичь, это в основном циферблат часов, и, когда вращающаяся часовая стрелка вращается, вы можете начать и остановить его, нажав и извлекая угол.

Кто-нибудь знает хороший пример? или может помочь мне здесь. Благодарю.

UPDATE/EDIT

Используя удивительный Obj-C ответ Роба ниже в мое приложение работает отлично. Incase кому-то интересно, это то, как отслеживать угол поворота и отображения его на экране:

Каждый раз, когда HandleDisplayLink называется, я назвал этот метод: [self calculateDisplayAngle];

Метод прост:

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

ответ

2

У вас могут быть только свойства, чтобы отслеживать состояние вращения, так что, когда вы его остановите, он может забрать, где он остановился. Например:

@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 
+0

Похоже, это имеет смысл. Так оно и есть. 360 оборотов каждые 2,5 секунды? И вращаться бесконечно, пока не остановится? Будет ли это работать, если мой UIImageView находится на моей раскадровке и связан с моим «.h»? Извините, это мой первый раз с такой штукой. Кроме того, в этом контексте я не видел синтаксиса вопросительного знака. Уже поздно, поэтому я правильно посмотрю на это завтра. – Reanimation

+0

Ой, подождите, это быстро? – Reanimation

+0

К сожалению, извиняюсь за это. Спасибо, что нашли время для публикации, я действительно ценю это. Я попытаюсь перевести его в ObjC завтра. – Reanimation