标签:
UITableViewCell很难满足我们的需求,因此,CustomCell(自定义单元格)至关重要。下面将通过一个例子演示自定义Cell。第二部分演示根据文本内容自适应Label、Cell高度。
第一部分 CustomCell的创建
1、创建DemoTableViewController,继承自UITableViewController,并设置其为window的根视图
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
DemoTableViewController *demoVC = [[DemoTableViewController alloc] initWithStyle:UITableViewStylePlain];
self.window.rootViewController = demoVC;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
2、创建CustomTableViewCell,继承自UITableViewCell
声明CustomCell中所需属性:
@property(nonatomic, retain) UILabel *customLabel;
重写初始化方法:
CustomTableViewCell.m
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.customLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, 100, 30)];
_customLabel.backgroundColor = [UIColor blueColor];
[self.contentView addSubview:_customLabel];
}
return self;
}
DemoTableViewController.m
3、设置TableView的section和row均为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
4、加载单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.customLabel.text = @"Hello";
return cell;
}
第二部分 Cell高度自适应
使用NSString的类目 @interface NSString (NSExtendedStringDrawing)
中的方法
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(7_0);
1、创建getTextHeight:方法。参数设为UILabel
- (CGFloat)getTextHeight:(UILabel *)label
{
/*
Size:估算高度。
如果计算结果大于Size,则取小于Size的最大值作为返回值,否则,直接返回结果
options:枚举值,表示以何种方式计算
NSStringDrawingUsesLineFragmentOrigin 以行高为单位累加;还表示Size(第一个参数)的高度将被忽略
NSStringDrawingUsesFontLeading 行高(包括行间距)
attributes: @{NSFontAttributeName:font}
context:NULL
*/
CGSize maxSize = CGSizeMake(label.frame.size.width, 100); //最大行高,即下面方法计算出来的行高小于maxSize.height
CGRect rect = [label.text
boundingRectWithSize:maxSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:label.font}
context:NULL];
return rect.size.height;
}
2、声明textString属性作为测试字符串,并在viewDidLoad中为其赋值
DemoTableView.m
@interface DemoTableViewController ()
@property (nonatomic, retain) NSString *textString;
@end
@implementation DemoTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textString = [[UILabel alloc] init];
_textString.text = @"第一行。\n第二行。。\n第三行。。。\n第四行。。。。\n第五行\n第六行";
}
3、在下面方法中增加内容设置customLabel高度
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
//设置customLabel高度
cell.customLabel.text = _textString.text;
cell.customLabel.numberOfLines = 0;
CGRect rect = cell.customLabel.frame;
rect.size.height = [self getTextHeight:cell.customLabel];
cell.customLabel.frame = rect;
return cell;
}
4、计算并设置cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self getTextHeight:_textString]+10;
}
UI_11 自定义UITableViewCell、Cell的高度自适应
标签:
原文地址:http://my.oschina.net/zooyf/blog/499050