技术iOS 常见实践iOS进阶指南

关于UITableView的一些小技巧

2015-10-14  本文已影响766人  南国青天

1.如何巧妙隐藏一行 UITableViewCell

有些时候, 我们想动态的隐藏某一行的UITableView里面某一行的Cell,一般我们会用到下面代码去实现第三行Cell隐藏.

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:
(NSIndexPath *)indexPath {
    return indexPath.row == 3 ? 0 : 40;
}

但是很不幸的是, 我们有时候虽然把高度设置 0, 但是有时候Cell里面的Label的文字还是显示, 还和其他Cell重叠.


3C0DD058-3707-498B-A8DE-AAE44786918D.png
解决方法

有很多方法去解决这个问题, 只需要设置UITableViewDelegate里面添加下面代码, 或者在你的继承UITableViewCell的子类里面把这个属性设置YES.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.clipsToBounds = YES;
}

2.关于UITableView设置成Plain格式, 禁止SectionView悬浮

UITableView的Plain风格, 导致SectionTitle, SectionView悬浮在Navigation的下面, 不随这TableView滑动而滑动, 下面代码解决悬浮问题

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat sectionHeaderHeight = 30;
    
    BOOL isUpSectionScrollToNavigation = scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0;
    BOOL isDownSectionScrollOutNavigation = scrollView.contentOffset.y >= sectionHeaderHeight;
    
    if (isUpSectionScrollToNavigation) {
        scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    }else if (isDownSectionScrollOutNavigation){
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
    }
}

3. 纯代码 UITableViewCell 应该哪里初始化视图

如果你使用的Cell是代码+Nib. 那么你在自定义的Cell的时候你可以在awakeFromNib添加

//Custom UITableViewCell
- (void) awakeFromNib {
  ....
  //在这里你可以用代码给Cell添加Label ImageView什么的. 该方法在Cell周期只会被执行一次
  ....
}
// UITableView
void viewDidLoad {
..
    [self.tableView registerNib:[UINib nibWithNibName:@"DownloadCell" bundle:nil] forCellReuseIdentifier:cellID];
..
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DownloadCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
    return cell
}

但是如果你使用的是纯代码构建的UITableCell. 那么你就最好不要使用registerClass方法. 因为UITableViewCell不会执行awakeFromNib. 那么你在哪里添加你自定义的控件呢?

//Custom UITableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]
    if (self) {
        //在这里你可以用代码给Cell添加Label ImageView什么的. 该方法在Cell周期只会被执行一次
    }
    return self
}

// UITableView
void viewDidLoad {
..
   // [self.tableView registerNib:[UINib nibWithNibName:@"DownloadCell" bundle:nil] forCellReuseIdentifier:cellID];
..
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DownloadCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID];
  if (cell == nil) {
        cell = [[DownloadCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    return cell
}

参考文献

上一篇下一篇

猜你喜欢

热点阅读