gpt4 book ai didi

cocoa - 有没有正确的方法来处理重叠的 NSView sibling ?

转载 作者:行者123 更新时间:2023-12-03 16:02:23 30 4
gpt4 key购买 nike

我正在开发一个 Cocoa 应用程序,并且遇到了一种情况,我希望两个 NSView 对象重叠。我有一个父 NSView,其中包含两个 subview (NSView A 和 NSView B),每个 subview 都可以有自己的多个 subview 。

有没有适当的方法来处理这种重叠? NSView B 始终位于 NSView A 的“上方”,因此我希望 NSView A 的重叠部分被屏蔽。

最佳答案

Chris,唯一的解决方案是使用 CALayers。这绝对是唯一的解决方案。

NSView 在 OSX 中完全损坏(2010 年 9 月):同级无法正常工作。其中一个将随机出现在顶部。

重复一遍,问题出在 sibling 上。

要测试这一点:使用 NSViews 和/或 nsimageviews。制作一个具有大图像(例如 1000x1000) View 的应用程序。在 View 中,到处放置三到四个小图像/NSView。现在将另一个大的 1000x1000 图像放在上面。反复构建并启动应用程序 - 您会发现它完全损坏了。通常,下面的(小)层会出现在大覆盖层的顶部。如果你在 NSView 上打开图层支持,无论你尝试什么组合,它都没有帮助。这就是最终的测试。

你必须放弃 NSViews 并使用 CALayers,仅此而已。

CALayers 唯一的烦恼是你不能使用 IB 来设置你的东西。您必须在代码中设置所有图层位置,

yy = [CALayer layer];
yy.frame = CGRectMake(300,300, 300,300);

仅创建一个 NSView,其唯一目的是保存您的第一个 CALayer(可能称为“后部”),然后将所有 CALayer 放入后部。

rear = [CALayer layer];
rear.backgroundColor = CGColorCreateGenericRGB( 0.75, 0.75, 0.75, 1.0 );

[yourOnlyNsView setLayer:rear]; // these two lines must be in this order
[yourOnlyNsView setWantsLayer:YES]; // these two lines must be in this order

[rear addSublayer:rr];
[rear addSublayer:yy];
[yy addSublayer:s1];
[yy addSublayer:s2];
[yy addSublayer:s3];
[yy addSublayer:s4];
[rear addSublayer:tt];
[rear addSublayer:ff];

一切都可以完美地工作,您可以嵌套和分组您想要的任何内容,并且无论您的结构多么复杂,所有内容都可以完美地显示在应显示在上方/下方的所有内容的上方/下方。稍后您可以对图层执行任何操作,或者以典型的方式将内容打乱,

-(void) shuff
{
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.0f]
forKey:kCATransactionAnimationDuration];
if ..
[rear insertSublayer:ff below:yy];
else
[rear insertSublayer:ff above:yy];
[CATransaction commit];
}

(对你所做的一切进行烦人的“零秒”包装的唯一原因是阻止免费提供给你的动画 - 除非你想要动画!)

顺便说一句,苹果公司的这句话,

For performance reasons, Cocoa does not enforce clipping among sibling views or guarantee correct invalidation and drawing behavior when sibling views overlap.

他们的以下句子...

If you want a view to be drawn in front of another view, you should make the front view a subview (or descendant) of the rear view.

很大程度上是无意义的(你不一定用子替换同级;并且上面测试中描述的明显错误仍然存​​在)。

这就是 CALayers!享受吧!

关于cocoa - 有没有正确的方法来处理重叠的 NSView sibling ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466297/

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