我开始转换NSImageView。我最初的尝试是
self.imageView.wantsLayer = YES;
self.imageView.layer.transform = CATransform3DMakeRotation(1,1,1,1);
不幸的是我注意到转换只发生有时(可能每5次运行一次)。添加NSLog之间确认在某些运行self.imageView.layer
上为空。整个项目的状态如下图所示。
它是一个非常简单的200x200 NSImageView,带有生成的NSViewController的插座。一些实验显示设置wantsDisplay没有解决问题,但是将变换放在NSTimer上使其每次都有效。我喜欢解释为什么会发生这种情况(我认为这是因为一些竞争条件)。
我在macOS 10.12上使用Xcode 8,但我怀疑这是问题的原因。
更新
删除wantsLayer
并疯狂地在Interface Builder中启用核心动画层并没有解决问题。
也没有尝试动画它(我不确定我希望的是什么)
// 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 :(得分:0)
在尝试使用allowsImplicitAnimation之后,我意识到我可能想要过早制作动画。
将转换代码移动到viewDidAppear
使其每次都有效。
- (void)viewDidAppear {
[super viewDidAppear];
self.imageView.animator.layer.transform = CATransform3DMakeRotation(1,1,1,1);
}