现在我有以下内容:

- (void)drawRect
{
    // some drawing

    [bgImage drawinRect:self.bounds];

    // some drawing
}

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

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

我试过的
  • 使用子视图代替drawRect。就我而言,这是非常慢的,因为无法混合的颜色。
  • 将UIImageView添加为背景无济于事,我们不能在子视图上绘制...
  • 将图像层添加到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
    }
    

    现在,除了此新层外,什么都看不到。我认为我所有的绘画都在这一层之下。

    最佳答案

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

    另一个建议:

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

    08-18 07:24