2

我有一个表格视图,其中包含数百个使用该drawRect:方法绘制的自定义绘制的 UITableViewCell。这些单元格都共享相同的颜色样式。所以,在每个drawRect:,我做这样的事情:

-(void)drawRect:(CGRect)rect
{
    UIColor *bgColor = [UIColor colorWithWhite:0.9 alpha:1.0];
    UIColor *textColor = [UIColor colorWithWhite:0.98 alpha:1.0];
    UIColor *strokeColor = [UIColor colorWithWhite:0.6 alpha:1.0];
    /* use colors */
}

因此,当您向下滚动表格时,它会被调用数百次。不过,我不确定我正在做的事情是否有效。有没有更好的方法来创建这些颜色,也许有一些可重用性?我应该将这些颜色缓存在某个全局变量中吗?我正在做的事情是昂贵的还是微不足道的?

4

3 回答 3

4

首先,您应该使用 Instruments 进行分析,以查看这些调用是否花费了大量时间。如果是这种情况,则将它们设为静态变量并在首次使用时对其进行初始化:

-(void)drawRect:(CGRect)rect
{
    static UIColor *bgColor;
    static UIColor *textColor;
    static UIColor *strokeColor;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        bgColor = [UIColor colorWithWhite:0.9 alpha:1.0];
        textColor = [UIColor colorWithWhite:0.98 alpha:1.0];
        strokeColor = [UIColor colorWithWhite:0.6 alpha:1.0];
    });

    /* use colors */
}
于 2012-07-30T19:00:16.977 回答
2

有没有更好的方法来创建这些颜色,也许有一些可重用性?

您的单元格可以包含一个MONSharedCellStuff对象,该对象可以由创建单元格的控制器创建和设置。接口可以采用以下形式:

@interface MONSharedCellStuff : NSObject

@property (nonatomic, copy, readonly) UIColor * bgColor;
@property (nonatomic, copy, readonly) UIColor * textColor;
@property (nonatomic, copy, readonly) UIColor * strokeColor;

@end

你也可以使用这个实例来共享其他不可变的东西(常见的图像或字体)。

或者,单元可以在初始化期间自己创建和保存它们(尽管这比正确共享需要更多的时间和内存)。这对于简单的情况很好。

有了这么多的细胞,有效地重用细胞很重要。

我应该将这些颜色缓存在某个全局变量中吗?

不,创建单元的控制器可能是缓存和创建它们的好地方。

我正在做的事情是昂贵的还是微不足道的?

请参阅内存和 CPU 分析器。

于 2012-07-30T20:21:31.320 回答
0

为此,我写了一篇关于使用 UIColor 类别的博客文章。

于 2013-07-10T09:18:36.867 回答