图层支持viewDidLoad中的NSView问题

时间:2016-07-24 19:31:00

标签: macos cocoa core-animation calayer nsview

我开始转换NSImageView。我最初的尝试是

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

不幸的是我注意到转换只发生有时(可能每5次运行一次)。添加NSLog之间确认在某些运行self.imageView.layer上为空。整个项目的状态如下图所示。

Project state

它是一个非常简单的200x200 NSImageView,带有生成的NSViewController的插座。一些实验显示设置wantsDisplay没有解决问题,但是将变换放在NSTimer上使其每次都有效。我喜欢解释为什么会发生这种情况(我认为这是因为一些竞争条件)。

我在macOS 10.12上使用Xcode 8,但我怀疑这是问题的原因。

更新

删除wantsLayer并疯狂地在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];

1 个答案:

答案 0 :(得分:0)

在尝试使用allowsImplicitAnimation之后,我意识到我可能想要过早制作动画。

将转换代码移动到viewDidAppear使其每次都有效。

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