【问题标题】:Core Animation view is not displaying sometimes核心动画视图有时不显示
【发布时间】:2009-05-26 02:00:46
【问题描述】:

我正在使用 Core Animation 开发一个 Cocoa 项目,并且我有一个自定义视图,它显示在两个窗口中。它总是显示在一个窗口中,但有时在我启动应用程序时不会显示在另一个窗口中。据我所知,这完全是随机的。这是我在视图初始化时调用的代码。无论视图是否出现,它都会访问此代码。

[self setWantsLayer:YES];

root = [self layer]; // root is a CALayer

root.layoutManager = [CAConstraintLayoutManager layoutManager];
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];

[self setNeedsDisplay:YES];

为什么视图有时会显示而有时却不显示?

编辑:如果我自己创建根 CALayer 而不是像我目前正在做的那样将它设置为视图的“层”会有所不同吗?

【问题讨论】:

    标签: cocoa macos core-animation


    【解决方案1】:

    看起来有一个非常简单的解决方案,但没有很好的文档记录。我没有将 root 设置为子类视图的层,而是将 root 创建为新的 CALayer,然后将视图的层设置为 root。原始问题的代码现在看起来像:

    // self is the sub-classed NSView
    [self setWantsLayer:YES];
    
    // Set root to a new CALayer
    root = [CALayer layer];
    
    root.layoutManager = [CAConstraintLayoutManager layoutManager];
    root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
    
    [root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
    
    // Set the view's layer to root
    [self setLayer:root];
    

    我在想,有时当我的初始化代码被调用时,视图没有初始化与其自身关联的层,因此没有正确分配根。这只是一种预感,但进行上述更改已经解决了我的视图不总是显示的问题。

    【讨论】:

      【解决方案2】:

      当您说它在两个窗口中显示时,您是指视图类的两个实例在两个窗口中,还是您的意思是您试图将相同的实际视图实例放入两个窗口中?给定视图只能是单个视图层次结构的一部分。将其安装到一个中会将其从其所在的层次结构中删除。

      【讨论】:

      • 同一个自定义(子类)视图有两个实例,每个窗口中都有一个。它们都是通过将自定义视图拖到 Interface Builder 中的窗口上来创建的,然后为每个视图设置自定义类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多