【问题标题】:New CALayer.contents does not display until view is resized在调整视图大小之前不会显示新的 CALayer.contents
【发布时间】:2011-08-21 19:13:35
【问题描述】:

我有一个需要显示视频帧的CALayer。每次渲染一帧(作为CGImageRef),都会调用这个方法:

- (void)displayFrame:(CGImageRef)frame {
    [view layer].contents = (id)frame;
}

奇怪的是,起初它不会显示任何东西。每次调整view 的大小时,都会显示一个新的frame,但会一直保持到view 再次调整大小。

我该如何解决这个问题?

【问题讨论】:

    标签: objective-c cocoa core-animation calayer cgimage


    【解决方案1】:

    是否在主线程上调用 displayFrame:?如果不是,那么我发现它不会总是绘制。您可以尝试使用 [CATransaction flush] 来强制它更新:

    - (void)displayFrame:(CGImageRef)frame {
        [view layer].contents = (id)frame;
        [CATransaction flush];
    }
    

    如果这不起作用,那么您可以尝试包含层构造代码以帮助识别该层的任何特性。

    【讨论】:

    • 太棒了!谢谢你。似乎没有在主线程上调用displayFrame:。使用[self performSelectorOnMainThread:@selector(displayFrame:) withObject:(id)frame waitUntilDone:NO]; 解决了这个问题。
    【解决方案2】:

    你可能需要做[[view layer] setNeedsDisplay]。需要通知绘图系统已经进行了更新并且需要重新绘制屏幕。调整视图大小可以做到这一点,但似乎更改图层的contents 可能不会。

    【讨论】:

    • 我在[view layer].contents = (id)frame 之后添加了[[view layer] setNeedsDisplay],但我仍然得到相同的行为。 :(
    • 好吧,废话。尝试将视图标记为需要显示? [view setNeedsDisplay:YES];
    【解决方案3】:

    使用[CATransaction flush]; 对我有用。我必须弄清楚使用这种方法显示文本会受到什么(如果有的话)性能影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2012-06-19
      相关资源
      最近更新 更多