NSView或CALayer的子视图?

Tro*_*sen 3 cocoa objective-c calayer nsview

今天我决定尝试使用CALayers来显示覆盖NSView的矩形框.该图层将包含一些文本,并将根据何时需要显示变量文本来打开和关闭.我想使用CALayer的原因是你可以轻松地使用CALayer进行渲染和动画.我实现了我的图层,它就像一个魅力.但是,在使用我的GUI并在各种按钮上单击几次打开和关闭图层之后,我认为我的图层视图的层次结构似乎是倾斜的.我认为焦点必须切换到其他一些已被关闭的NSView.我基本上对于在给定时间处理哪个层并且失去了对视图层次结构的控制感到非常困惑.

我的问题是:我应该使用NSView或CALayers的子视图来显示可能在应用程序中多次打开和关闭的内容吗?在我看来,很容易失去对你正在处理的层的控制.有没有办法通过名称识别当前图层,以便您可以重复使用图层,或者最好是使用图层,删除它们,然后在下次需要时重新创建图层?

谢谢你的时间.干杯,特隆德

Fat*_*tie 9

FWIW,

  1. 我经常很快地"打开和关闭"CALayers,没有任何问题.如果你愿意,你可以这样做!

  2. 删除它们并在运行中快速重新创建它们似乎不会导致任何问题.(这不是一个很大的资源用户,我从来没有看到任何其他问题.)如果你愿意的话,一定要这样做!

  3. 我实际上不明白你对"命名"层的意思 - 当然,因为iVars他们有一个名字!您必须为所有CALayers命名.

这是典型的生产代码(来自.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..
Run Code Online (Sandbox Code Playgroud)

等等.你知道,我真的不知道你怎么能"不"命名它们!

最后,

4,不要忘记图层比NSViews"更好",因为:NSViews在重叠的兄弟姐妹之间存在伪劣/错误的关系:它们基本上不起作用.在这里阅读: 将iOS(iPhone)应用程序移植到mac?

希望能帮助到你!

PS - 这些也可以帮助CALayers ......

究竟应该在CALayer的display/drawRect方法中发生什么?

CGLayer和CALayer有什么区别和兼容性?