UITableViewCell的四种类型
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
实际应用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell;
switch (indexPath.row) {
case 0:
{
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CELL1];
cell.backgroundColor = [UIColor yellowColor];
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
}
break;
case 1:
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CELL2];
cell.backgroundColor = [UIColor redColor];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
}
break;
case 2:
{
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CELL2];
cell.backgroundColor = [UIColor blueColor];
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
}
break;
case 3:
{
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CELL4];
cell.backgroundColor = [UIColor purpleColor];
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
}
break;
}
cell.imageView.image = [UIImage imageNamed:@"warning_btn"];
cell.detailTextLabel.text = @"detailTextLabel";
cell.textLabel.text = @"textLabel";
return cell;
}
效果图
UITableViewCell的四种类型
UITableViewCellAccessoryNone,
UITableViewCellAccessoryDisclosureIndicator,
UITableViewCellAccessoryDetailDisclosureButton,
UITableViewCellAccessoryCheckmark
UITableViewCellAccessoryDetailButton
获取button 所在cell行
cell 上面放button, 除了通过 cell.btn.tag 值获取cell的行数之外,另一种方便可行的方式
[cell.button addTarget:self action:@selector(cellButtonClicked:event:) forControlEvents:UIControlEventTouchUpInside];
// 点击事件
- (void)cellButtonClicked:(id)sender event:(id)event {
NSSet * touches =[event allTouches];
UITouch * touch =[touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:_tableView];
NSIndexPath * indexPath = [_tableView indexPathForRowAtPoint:currentTouchPosition];
if (indexPath!= nil) {
// 代码区
}
}
防止点击cell后仍为灰色
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
防止plain模式悬浮
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 50;
if(scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0,0);
} else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
改变HeaderFooter颜色
#pragma mark 代理方法改变headerfooter颜色
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
if ([view isMemberOfClass:[UITableViewHeaderFooterView class]])
{
((UITableViewHeaderFooterView *)view).backgroundView.backgroundColor = [UIColor clearColor];
}
}
手势冲突
很多猿(特别新猿)为了实现某些功能(例如收键盘)就给表格或者表格父视图添加了手势,那么问题来了: gestureRecognizer会影响到tableview本身事件,导致代理方法不回调(例如didSelectRowAtIndexPath:不走)。
解决方案:实现gestureRecognizer的一个代理
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return ![NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"];
}
使用中存在的误区
手动调用 tableView:cellForRowAtIndexPath: 获取cell,引起的卡顿问题
即使有经验的猿也会进的一个误区: 手动调用tableView:cellForRowAtIndexPath: , 例如在tableView: didSelectRowAtIndexPath: 或者 tableView:heightForRowAtIndexPath: 中 [tableView cellForRowAtIndexPath:indexpath]; 获取cell,来进行某些操作,但是这样手动调用改方法产生的cell就不再参与cell复用了,就直接导致在你浑然不知的情况下可能创建了很多cell,当界面单一时体现不明显,但是当有复杂cell且多图情况下,就造成了卡顿。
解决方案:在继承UITableViewCell的自定义cell中改变你想要的属性,而不是在tableView中获取cell传值进入。
注意事项
- insert Row或者delete Row的时候要相应的增加和减少代理方法返回的行数。
- 注册自定义cell都要在tableview(collectionview也适用)初始化之后,否则无效。单独xib加载文件后才能有效注册cell。
- tableView的section头和section尾的高度设置为0时是无效的。
// 只设一个可能仍出现20的高度,也不可设置0
// Header底部间距
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40;//section头部高度
}
// footer底部间距
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.001;
}