【问题标题】:Subview of NSView or CALayer?NSView 或 CALayer 的子视图?
【发布时间】:2011-07-09 14:12:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c cocoa calayer nsview


    【解决方案1】:

    FWIW,

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

    2. 动态删除它们并快速重新创建它们似乎不会导致任何问题。 (这不是一个大资源用户,我从未见过这样做的任何其他问题。)所以如果你愿意,一定要这样做!

    3. 我实际上不明白您所说的“命名”层是什么意思 - 当然,作为 iVar,它们有一个名称!您必须为所有 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..
    

    等等等等。我真的不明白你怎么能“不”给它们命名,你知道的!

    最后,

    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?

    【讨论】:

    • 您的回答很有道理,当我实施它时,我能够控制我的图层。我最初没有命名我的 CALayers,除了我的 rootlayer。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多