2

现在我有以下内容:

- (void)drawRect
{
    // some drawing

    [bgImage drawinRect:self.bounds];

    // some drawing
}

我有 40 多个视图,里面有文字和一些标记。我需要在用户点击时重新绘制所有这些视图 - 它应该非常快!

我检测了我的代码并看到:所有执行时间的 75%是调用[MyView drawRect:],而我的 drawRect 时间的 95% 是[bgImage drawinRect:self.bounds]调用。我需要在 GPU 或 CPU 内绘制背景。这怎么可能?

我试过的:

  1. 使用子视图而不是 drawRect。在我的情况下,由于无法混合的颜色,它非常慢。
  2. 添加 UIImageView 作为背景没有帮助,我们不能在子视图上绘制......
  3. 将图像层添加到 CALayer?可能吗?

更新:

现在我正在尝试使用 CALayer 而不是 drawInRect。

- (void)drawRect
{
    // some drawing

    CALayer * layer = [CALayer layer];
    layer.frame = self.bounds;
    layer.contents = (id)image.CGImage;
    layer.contentsScale = [UIScreen mainScreen].scale;
    layer.contentsCenter = CGRectMake(capInsects.left / image.size.width,
                                      capInsects.top / image.size.height,
                                      (image.size.width - capInsects.left - capInsects.right) / image.size.width,
                                      (image.size.height - capInsects.top - capInsects.bottom) / image.size.height);

    // some drawing
}

现在除了这个新层之外什么都看不见。我所有的画都在这一层下,我想......

4

1 回答 1

1

我会使用 UILabels;shouldRasterize = YES您可以通过为标签提供背景颜色或在包含这些标签的视图层上进行设置来降低混合成本。(您可能还希望设置rasterizationScale为与 相同[[UIScreen mainScreen] scale])。

另一个建议:

有许多开源日历组件可能不得不尝试解决相同的问题。也许你可以看看他们是如何解决这些问题的。

于 2012-08-25T13:54:58.850 回答