drawInRect方法工作得太慢

时间:2012-08-25 13:04:56

标签: ios uiview drawrect

现在我有以下内容:

- (void)drawRect
{
    // some drawing

    [bgImage drawinRect:self.bounds];

    // some drawing
}

我有超过40个带有文本和内部标记的视图。我需要在用户点击上重新绘制所有这些视图 - 它应该非常快!

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

我尝试了什么:

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

    现在我正在尝试使用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
    }
    

    现在看不到这个新图层。我认为所有的绘画都在这层之下......

1 个答案:

答案 0 :(得分:1)

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

另一个建议:

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