美文网首页iOS 深度好文
关于UITableView 分割线的那点事

关于UITableView 分割线的那点事

作者: 无神 | 来源:发表于2017-03-07 08:20 被阅读696次

    我们在开发中,UITableView是很常用的控件。有的时候,系统自带的分割线可以满足产品的要求(实在是万幸),但是大部分时候,系统自带的分割线并不能满足产品的需求,那就需要我们自定义。那么tableview的分割线我们一般是如何绘制的呢?

    温馨提示:以下设置分割线的方法只针对于tableview的plain样式,group样式不适用。

    一、自己添加一个view来实现

    我们自定义tableview的分割线的时候,一般是采用如下的方式:

      1. 先在tableview中,关闭系统自带的分割线。
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
      1. 在cell中添加一个view。按需求设置好颜色,设置view的高度为一个像素。然后把这个view添加到cell的contentview上。
    - (UIView *)line {
    
       if (!_line) {
           
           _line = [[UIView alloc] initWithFrame:CGRectMake(0,54, [UIScreen mainScreen].bounds.size.width, 1.0/[UIScreen mainScreen].scale)];
           _line.backgroundColor = [UIColor blueColor];
       }
       return _line;
    }
    

    二、改造系统的分割线

    随着开发时间越来越长,后来发现修改系统分割线的一些属性也可以达到需求想要的效果,不一定要采用添加一个view的方式来实现自定义分割线。

    系统自带的分割线不是和屏幕等宽的,而是距离左边缘15个像素。

    造成以上效果的原因是系统自带的分割线的edgeInsets默认是UIEdgeInsetsMake(0, 15, 0, 0)

    UIEdgeInsets的定义如下,分别是距离顶部、左边缘、底部、右边缘的距离。

      UIKIT_STATIC_INLINE UIEdgeInsets UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) {
        UIEdgeInsets insets = {top, left, bottom, right};
        return insets;
    }
    

    UIEdgeInsetsZeroUIEdgeInsetsMake(0, 0, 0, 0)是相等的。
    找到了系统分割线和屏幕不等宽的原因,那么当我们需要一条和屏幕等宽的分割线时,就可以通过修改degeInsets来达到效果。步骤如下:

    • 1.设置tableview的相关属性。
        tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; //设置分割线的分割
        tableView.separatorColor = [UIColor blueColor]; //设置分割线的颜色
        [tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; //设置分割线的边Insets
    

    separatorStyle 可以不设置,默认是打开的。

    • 2.在cell的初始化方法中调用该方法:
     [self setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    

    @property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR __TVOS_PROHIBITED; // allows customization of the separator frame

    NS_AVAILABLE_IOS说明iOS7之后的系统都生效,所以setSeparatorInset:可以放心调用。

    如果需要一条两边都留边距的分割线,修改UIEdgeInsetsMake的左右边距即可。例如:左右边距同时留10个像素。代码如是[self setSeparatorInset:UIEdgeInsetsMake(0, 10, 0, 10)];

    温馨提示:如果tableview和cell里设置的edgeInsets不一致时,cell里设置的edgeInsets生效。

    综上所述:个人觉得以上两种设置分割线的方法,采用修改系统属性来达到要求的方式更好一些。代码量更少一些,维护方便,还有就是不会有坐标设置的问题产生,如果使用自定义view的方式,如果坐标设置的不严谨,会有坐标问题产生。除非是修改系统属性实在是达不到产品要求,才建议去自己写view实现分割线。个人见解,仅供参看。

    时代在进步,人类的社会在发展。加油,明天会更好。

    相关文章

      网友评论

      本文标题:关于UITableView 分割线的那点事

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