gpt4 book ai didi

objective-c - NSView CALayer 不透明度疯狂

转载 作者:行者123 更新时间:2023-12-03 16:24:49 25 4
gpt4 key购买 nike

似乎我的 NSView 的图层属性有时不可编辑/错误。在下面的代码中,动画效果完美,一切看起来都很正常。 NSlog 的输出始终是:

anim over opacity = 1.00000
first opacity = 0.50000
current opacity = 0.00000
updated opacity = 0.00000

前两个日志看起来是正确的,因此即使动画停止,图层似乎也可以正常运行。然而,过了一段时间,当我检查不透明度时,它神奇地变成了0。更错误的是,当我将图层的不透明度设置为1,并立即检查它时,它仍然是0。这怎么可能?

我在图层中使用 setneedsdisplay 并在 nsview 中使用 setneedsdisplay:YES 进行闲逛没有帮助。非常感谢任何建议。

- (void) someSetupAnimationMethod {
aLayer = [CALayer layer];
[theView setWantsLayer:YES];
[theView setLayer:aLayer];

[aLayer setOpacity:0.0];
CABasicAnimation *opacity = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacity.byValue = [NSNumber numberWithFloat:1.0];
opacity.duration = 0.3;
opacity.delegate = self;
opacity.fillMode = kCAFillModeForwards;
opacity.removedOnCompletion = NO;
[opacity setValue:@"opacity done" forKey:@"animation"];
[aLayer addAnimation:opacity forKey:nil];
}

- (void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if([[anim valueForKey:@"animation"] isEqualToString:@"opacity done"]) {
NSLog(@"anim over opacity = %f", aLayer.opacity);
aLayer.opacity = 0.5;
[aLyaer removeAllAnimations];
NSLog(@"first opacity = %f", aLayer.opacity);
}
}

- (void) someLaterMethod {
NSLog(@"current opacity = %f", aLayer.opacity);
aLayer.opacity = 1.0;
NSLog(@"updated opacity = %f", aLayer.opacity);
}

最佳答案

通过创建图层支持的 View ,然后尝试直接操作图层,您违反了基本的 CALayer/NSView 规则。

aLayer = [CALayer layer];
[theView setWantsLayer:YES];
[theView setLayer:aLayer];

当您在调用 setLayer: 之前告诉 View 使用图层时, View 将变为“图层支持”——它只是使用图层作为缓冲区以及您想要的所有绘图do 应该通过通常的 drawRect: 和相关方法来完成。不允许直接触摸该层。如果您更改这些调用的顺序:

[theView setLayer:aLayer];
[theView setWantsLayer:YES];

您现在有一个“图层托管” View ,这意味着该 View 仅在屏幕上提供一个空间供图层绘制到其中。在这种情况下,您可以直接在图层中进行绘图。由于图层的内容成为 View 的内容,因此您无法添加 subview 或使用 View 的绘制机制。

-[NSView setWantsLayer:] 中提到了这一点文档;我还发现了一个old cocoa-dev thread这很好地解释了这一点。

我不确定这是否能解决您的问题,但据我所知,您正确执行了其他所有操作,例如设置填充模式并在动画完成后更新值。

关于objective-c - NSView CALayer 不透明度疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6806069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com