美文网首页技术iOS 常见实践iOS进阶指南
关于UITableView的一些小技巧

关于UITableView的一些小技巧

作者: 南国青天 | 来源:发表于2015-10-14 11:23 被阅读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
    }
    

    参考文献

    相关文章

      网友评论

      本文标题:关于UITableView的一些小技巧

      本文链接:https://www.haomeiwen.com/subject/okbocttx.html