NSView或CALayer的子视图?

时间:2011-03-05 22:10:52

标签: objective-c cocoa calayer nsview

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

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

感谢您的时间。干杯,特隆德

1 个答案:

答案 0 :(得分:9)

FWIW,

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

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

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

  4. 这是典型的生产代码(来自.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 ......

    Exactly what should happen in a CALayer's display/drawRect methods?

    What's the difference and compatibility of CGLayer and CALayer?