4

我最近发现通过在返回我的集合视图单元格之前添加它可以提高滚动动画性能(平滑度)。

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

如果我的单元格包含多个按钮,我需要单独光栅化这些按钮,还是会自动处理这些按钮?...还是我应该打扰?

我已经通过 Interface Builder 添加了按钮。

4

1 回答 1

3

如果我的单元格包含多个按钮,我需要单独光栅化这些按钮,还是会自动处理?

不,shouldRaserize 使图层和所有子图层栅格化。但是在使用它时我会小心,因为它会使您的单元层在每次更改时都被重新绘制。

看这个话题: UIView self.layer.shouldRasterize = YES 和性能问题

就我个人而言,我更喜欢在应用程序启动期间栅格化我只需要一次的图层。这是一个示例代码,您如何为您的单元格创建自定义分隔符:

@implementation UIImage (Extensions)

+ (UIImage *)imageFromLayer:(CALayer *)layer{
    UIGraphicsBeginImageContext([layer frame].size);

    [layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return outputImage;
}

@end

@implementation CellSeparatorView
static UIImage *patternLine;

__attribute__((constructor))
static void initialize_cell_separator(){
    @autoreleasepool {
        CAGradientLayer *gLayer = [CAGradientLayer layer];
        gLayer.frame = CGRectMake(0, 0, 1, 2);
        gLayer.locations = @[@(0),
                             @(0.5000),
                             @(0.5001),
                             @(1)];
        gLayer.colors = @[(id)[RGB(241, 241, 241, 1) CGColor],
                          (id)[RGB(241, 241, 241, 1) CGColor],
                          (id)[RGB(250, 250, 250, 1) CGColor],
                          (id)[RGB(250, 250, 250, 1) CGColor]];
        gLayer.contentsScale = [[UIScreen mainScreen] scale];
        gLayer.opaque = YES;
        dispatch_queue_t backgroundRenderQueue = dispatch_queue_create("backgroundRenderQueue", 0);
        dispatch_async(backgroundRenderQueue, ^{
            patternLine = [[UIImage imageFromLayer:gLayer] retain];
        });
    }
}

__attribute__((destructor))
static void destroy_cell_separator(){
    [patternLine release];
    patternLine = nil;
}

- (id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]){
        [self setBackgroundColor:[UIColor colorWithPatternImage:patternLine]];
        self.opaque = YES;
    }
    return self;
}

@end
于 2013-09-15T11:51:43.020 回答