NSView或CALayer的子视图?

4
今天我决定尝试使用CALayer来显示一个矩形框覆盖在NSView上。该图层将包含一些文本,并根据需要打开和关闭,以显示变量文本。我想使用CALayer的原因是可以轻松进行漂亮的渲染和动画效果。我实现了我的图层,它像魔术般地运行。然而,在使用GUI并多次单击各种按钮打开和关闭图层后,我发现我认为是我的图层视图的层次结构被扭曲了。我认为焦点必须已经切换到另一个再次关闭的NSView。我基本上对我在任何给定时间正在处理哪个图层感到非常困惑,并且失去了对视图层次结构的控制。
我的问题是:我应该使用NSView的子视图还是CALayers来显示应用程序中可能多次出现的内容?我觉得很容易失去对你正在处理的图层的控制。是否有一种方法可以通过名称识别当前图层,以便您可以重复使用该图层,或者最好使用图层,删除它们,然后在下次需要它们时重新创建图层?
谢谢您的时间。祝您好运,Trond
1个回答

10

对于你的参考:

  1. 我经常快速地打开和关闭CALayer,从来没有发生过问题。如果你想要这样做,那么可以这样做!

  2. 删除并在运行时快速重新创建它们似乎不会引起任何问题。(它不是一个大型资源使用者,我从来没有看到过其他问题。)所以如果你想这样做,一定要这样做!

  3. 实际上,我不明白你所说的“命名”图层是什么意思 - 当然,作为iVars它们有一个名称!你必须给所有的CALayer命名。

下面是一段典型的生产代码(来自.h文件):

CALayer         *rearLayer;
CALayer         *hugeBasket;        // holds everything for ez-on/off
CALayer         *theActualSkyline;  // nb, same name as similar UIView
CALayer         *someTrees;         // minor stuff
CALayer         *someBushes;        // overs

// for the stupid help basket..
CALayer         *LLDRear;
CALayer         *LLDArrowLeft;
CALayer         *LLDArrowRight;
CALayer         *LLDPointlessUpArrow;
CALayer         *LLDYetAnotherStupidShadow;

// etc etc..

等等,这样下去永无止境。我真的不知道你怎么能“不”给它们命名,你知道的!

最后,

4、别忘了图层比NSViews更好,因为NSViews之间有着瑕疵/错误的重叠兄弟关系:它们本质上不起作用。在此阅读相关信息: port an iOS (iPhone) app to mac?

希望这有所帮助!

PS - 这些也可能对CALayers有所帮助...

一个CALayer的display/drawRect方法实际上应该做什么?

CGLayer和CALayer的区别和兼容性是什么?


你的回答很有道理,当我实施它时,我能够控制我的图层。最初,除了我的根图层之外,我没有给我的CALayers命名。 - Trond Kristiansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接