UITableViewCellLayoutManager
UITableViewCellLayoutManager is a model class for styling a UITableViewCell. It is the class that powers the "style" in the -[UITableViewCell initWithStyle:reuseIdentifier:] method. UITableViewCellLayoutManager is available since 3.0.
You can set your own layout manager to a table view cell with its layoutManager property.
Everything that can be done with layout manager can also be done with a subclass of UITableViewCell, which is SDK-compliant.
Predefined layout managers
Signature | +(UITableViewCellLayoutManager*)layoutManagerForTableViewCellStyle:(UITableViewCellStyle)cellStyle; |
---|---|
Available in | 3.0 – |
There are 6 predefined layout managers, 5 of which can be obtained using the +[UITableViewCellLayoutManager layoutManagerForTableViewCellStyle:] method:
Style | Manager class |
---|---|
0 (UITableViewCellStyleDefault) | UITableViewCellLayoutManager |
1 (UITableViewCellStyleValue1) | UITableViewCellLayoutManagerValue1 |
2 (UITableViewCellStyleValue2) | UITableViewCellLayoutManagerValue2 |
3 (UITableViewCellStyleSubtitle) | UITableViewCellLayoutManagerSubtitle |
1000 | UITableViewCellLayoutManagerEditable1 |
- | UIMoreListCellLayoutManager |
Subclassing layout managers
Subclassed layouts usually need to override -layoutSubviewsOfCell:, -textLabelForCell:, -detailTextLabelForCell:, --defaultTextLabelFontSizeForCell: and -defaultDetailTextLabelFontSizeForCell:. The following is an example layout manager:
@interface XXLayoutManager : UITableViewCellLayoutManager {} @end @implementation XXLayoutManager -(UILabel*)detailTextLabelForCell:(UITableViewCell*)cell { UILabel* label = [self defaultLabelForCell:cell]; label.textColor = [UIColor redColor]; label.shadowColor = [UIColor colorWithWhite:0 alpha:0.5]; label.shadowOffset = CGSizeMake(1, 1); return label; } -(CGFloat)defaultDetailTextLabelFontSizeForCell:(UITableViewCell*)cell { return [UIFont systemFontSize]; } -(void)layoutSubviewsOfCell:(UITableViewCell*)cell { [super layoutSubviewsOfCell:cell]; CGRect contentBounds = cell.contentView.bounds; UIImageView* imageView = [cell _imageView:NO]; if (imageView != nil) { CGRect imageFrame = imageView.frame; CGFloat leftPadding = imageFrame.origin.x + imageFrame.size.width; contentBounds.origin.x += leftPadding; contentBounds.size.width -= leftPadding; } UILabel* textLabel = [cell _textLabel:NO]; if (textLabel != nil) { CGFloat fontSize = textLabel.font.pointSize; if (fontSize == 0) textLabel.font = [UIFont boldSystemFontOfSize:[self defaultTextLabelFontSizeForCell:cell]]; NSString* text = textLabel.text; if (text == nil || [text length] == 0) [textLabel removeFromSuperview]; else if (textLabel.superview == nil) [cell.contentView addSubview:textLabel]; } UILabel* detailTextLabel = [cell _detailTextLabel:NO]; CGFloat detailWidth = 0; if (detailTextLabel != nil) { UIFont* font = detailTextLabel.font; CGFloat fontSize = font.pointSize; if (fontSize == 0) detailTextLabel.font = font = [UIFont boldSystemFontOfSize:[self defaultDetailTextLabelFontSizeForCell:cell]]; NSString* text = detailTextLabel.text; if (text == nil || [text length] == 0) [detailTextLabel removeFromSuperview]; else { detailWidth = [text sizeWithFont:font].width; if (detailTextLabel.superview == nil) [cell.contentView addSubview:detailTextLabel]; } } cell.contentView.bounds = contentBounds; const CGFloat vpad = 5, hpad = 20; textLabel.frame = CGRectMake(hpad, vpad, contentBounds.size.width-detailWidth-3*hpad, contentBounds.size.height-2*vpad); detailTextLabel.frame = CGRectMake(contentBounds.size.width-detailWidth-hpad, vpad, detailWidth, contentBounds.size.height-2*vpad); } @end
References
- Header: http://github.com/kennytm/iphone-private-frameworks/blob/master/UIKit/UITableViewCellLayoutManager.h