2011-03-05 49 views
3

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

我的问题是:我应该使用NSView的子视图还是CALayers来显示应用程序中可能会出现多次的开关?在我看来,很容易失去对你正在工作的层的控制。有没有一种方法可以通过名称来识别当前图层,以便您可以重新使用图层,或者最好是使用图层,删除图层,然后在下次需要图层时重新创建图层?

谢谢你的时间。欢呼声中,特龙

回答

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.. 

等等而上。我真的不知道你怎么可以“不”命名它们,你知道!

最后,

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?

+0

你的回答是有道理的,当我实现它,我能够控制我的层。我原本没有给我的CALayers命名,除了我的rootlayer。 – 2011-03-06 10:21:54