If my cell contains, multiple buttons do I need to rasterize those individually, or will that be taken care of automatically?
No, shouldRaserize makes the layer and all of sublayers rasterized. But i would be carefull, while using it, because it makes your cell layer being redrawn every time it changes.
Look at this topic:
UIView self.layer.shouldRasterize = YES and performance issues
Personally i prefer to rasterize layer's i need only once, during app launch. Here is an example code, how can your create custom separator for you cell's:
@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