当前位置:  开发笔记 > IOS > 正文

有没有一种正确的方法来处理重叠的NSView兄弟姐妹?

如何解决《有没有一种正确的方法来处理重叠的NSView兄弟姐妹?》经验,为你挑选了2个好方法。

我正在研究一个Cocoa应用程序,我遇到了一个我希望有两个NSView对象重叠的情况.我有一个父NSView,它包含两个子视图(NSView A和NSView B),每个子视图可以有几个自己的子视图.

有没有一种正确的方法来处理这种重叠?NSView B将始终位于NSView A的"上方",因此我希望屏蔽NSView A的重叠部分.



1> 小智..:

克里斯,唯一的解决方案是使用CALayers.这绝对是唯一的解决方案.

OSX(2010年9月)中的NSView很明显:兄弟姐妹无法正常工作.一个或另一个将随机出现在顶部.

重复一遍,问题出在兄弟姐妹身上.

要测试这个:使用NSViews和/或nsimageviews.制作一个视图是一个大图像的应用程序(1000x1000说).在视图中,在这里和那里放置三个或四个小图像/ NSView.现在将另一个大的1000x1000图像放在上面.反复构建和启动应用程序 - 你会发现它很明显.通常,下面(小)层将出现在大覆盖层的顶部.如果你打开NSViews上的图层支持,无论你尝试什么组合,它都无济于事.这是最终的测试.

您必须放弃NSView并使用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];
}

(对于你所做的一切,烦人的"零秒"包装的唯一原因是为了防止免费提供给你的动画 - 除非你想要动画!)

顺便提一下Apple的这句话,

出于性能原因,Cocoa不会在兄弟视图之间强制执行剪切,或者在兄弟视图重叠时保证正确的失效和绘制行为.

他们的以下句子......

如果要在另一个视图前绘制视图,则应将前视图设置为后视图的子视图(或后代).

在很大程度上是荒谬的(你不一定能用子代替兄弟;并且上面测试中描述的明显的bug仍然存在).

所以这是CALayers!请享用!



2> Chuck..:

如果您的应用程序仅为10.5,请打开视图的图层,它应该可以正常工作.

如果你的意思是支持10.4及以下,你需要找到一种不让视图重叠的方法,因为重叠的兄弟视图是未定义的行为.正如View编程指南所说:

出于性能原因,Cocoa不会在兄弟视图之间强制执行剪切,或者在兄弟视图重叠时保证正确的失效和绘制行为.如果要在另一个视图前绘制视图,则应将前视图设置为后视图的子视图(或后代).

我已经看到一些黑客可以使它有时候有点工作,但它不是你可以依赖的任何东西.您需要使View A成为View B的子视图,或制作一个处理其两个职责的巨型视图.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有