2016-07-24 46 views
1

Ich machte mich daran, ein NSImageView zu transformieren. Mein zunächst Versuch warLayer-unterstützte NSView-Probleme in viewDidLoad

self.imageView.wantsLayer = YES; 
self.imageView.layer.transform = CATransform3DMakeRotation(1,1,1,1); 

Leider bemerkte ich, dass die manchmal (vielleicht einmal alle 5 Läufe) nur geschieht verwandeln. Das Hinzufügen eines NSLog zwischen bestätigt, dass bei einigen Läufen self.imageView.layer null ist. Der Status des gesamten Projekts wird auf dem Bild unten angezeigt.

Project state

Es ist ein unglaublich einfaches 200x200 NSImageView mit einem Auslass zu einem erzeugten NSViewController. Einige Experimente zeigten Einstellungen wantsDisplay behebt das Problem nicht, aber wenn man die Transformation auf einen NSTimer setzt, funktioniert es jedes Mal. Ich würde eine Erklärung dafür lieben, warum dies passiert (ich nehme an, dass es aufgrund einer Race-Bedingung ist).

Ich benutze Xcode 8 auf dem MacOS 10.12, aber ich bezweifle, dass dies die Ursache des Problems ist.

aktualisieren

wantsLayer aus- und wie verrückt Core Animation Layers im Interface Builder ermöglicht nicht das Problem beheben.

Ticked core animation layers

Weder haben versucht es zu animieren (ich war nicht sicher, was ich gehofft hatte)

// Sometimes works.. doesn't animate 
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
    context.duration = 1; 
    self.imageView.animator.layer.transform = CATransform3DMakeRotation(1,1,1,1); 
} completionHandler:^{ 
    NSLog(@"Done"); 
}]; 

oder

// Animates but only sometimes 
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(1,1,1,1)]; 
animation.duration = 1; 
[self.imageView.layer addAnimation:animation forKey:nil]; 

Antwort

0

Nachdem mit allowsImplicitAnimation experimentiert wurde mir klar, ich könnte versuche zu früh zu animieren.

Das Verschieben des Transformationscodes in viewDidAppear hat es jedes Mal funktionieren lassen.

- (void)viewDidAppear { 
    [super viewDidAppear]; 
    self.imageView.animator.layer.transform = CATransform3DMakeRotation(1,1,1,1); 
}