2016-07-24 10 views
1

Я отправился преобразовать NSImageView. Моя первоначально попытка былаСложные проблемы NSView в представленииDidLoad

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

К сожалению, я заметил, что преобразование происходит только иногда (может быть, один раз каждые 5 прогонов). Добавление NSLog между подтверждением того, что на некоторых прогонах self.imageView.layer равно null. Состояние всего проекта показано на изображении ниже.

Project state

Это невероятно простой 200x200 NSImageView с выходом на генерируемый NSViewController. Некоторые эксперименты показали, что настройки хотят. Дисплей не устраняет проблему, но включение преобразования в NSTimer заставляет его работать каждый раз. Мне хотелось бы объяснить, почему это происходит (я полагаю, это связано с некоторыми условиями гонки).

Я использую Xcode 8 на macOS 10.12, но я сомневаюсь, что это является причиной проблемы.

Update

Удаление wantsLayer и безумно позволяя Core Animation Layers в Interface Builder не решить эту проблему.

Ticked core animation layers

Ни делали попытки оживить его (я не был уверен, что я надеялся)

// 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"); 
}]; 

или

// 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]; 

ответ

0

После экспериментов с allowsImplicitAnimation я понял, что я мог бы пытаться оживить слишком рано.

Перемещение кода преобразования в viewDidAppear заставляло его работать каждый раз.

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