tableView分割线设置全屏

2018-09-14  本文已影响101人  骑马纵天下

1. 分割线

cell和cell之间的线段,一般情况开发基本隐藏使用自定义的,不过相对来说默认的设置好更方便。

2. 对分割线的操作

iOS7以后系统提供了下列代码可以修改分割线四个位置分别对应上左下右。

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) 
    [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];   
}

隐藏分割线

_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

3. 分割线颜色及风格

 [_tableView setSeparatorColor:[UIColor clearColor]];

typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
UITableViewCellSeparatorStyleNone, //隐藏
UITableViewCellSeparatorStyleSingleLine, //默认风格
UITableViewCellSeparatorStyleSingleLineEtched   // This separator style is only supported for grouped style table views currently
};

4. iOS7后的分割线左边15像素问题

iOS7以后,UITableViewCell分割线左侧会有默认15像素的空白。

.只需要调用setSeparatorInset(iOS7)和setLayoutMargins(iOS8)方法。或者把此方法放到cellForRowAtIndexPath中都可以。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {    //调整(iOS8以上)view边距(或者在cell中设置preservesSuperviewLayoutMargins,二者等效)
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]){//调整(iOS7以上)表格分隔线边距
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    
}

5. iOS7后分割线不能全屏原因

iOS7之前系统默认就是全屏的,iOS7时UITableView多了separatorInset属性,在UITableView的头文件中解释如下:
iOS7时只要设置该属性为UIEdgeInsetsZero就没有问题了.

@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; 
// allows customization of the frame of cell separators 
允许定制单元格分隔符的框架

iOS8的UIView头多了个layoutMargins属性,头文件说明如下:


@property (nonatomic) UIEdgeInsets layoutMargins NS_AVAILABLE_IOS(8_0);边缘布局

 layoutMargins returns a set of insets from the edge of the view's bounds that denote a default spacing for laying out content.
 If preservesSuperviewLayoutMargins is YES, margins cascade down the view tree, adjusting for geometry offsets, so that setting the left value of layoutMargins on a superview will affect the left value of layoutMargins for subviews positioned close to the left edge of their superview's bounds
 If your view subclass uses layoutMargins in its layout or drawing, override -layoutMarginsDidChange in order to refresh your view if the margins change.

layoutMargins是view的bounds的边距,用来调整内容默认边距,如果preservesSuperviewLayoutMargins属性是YES,那么设置父控件的layoutMargins边距,就会影响所有子控件的相对于父控件bounds的layoutMargins边距
如果你的view的子类在布局或者绘图中使用了layoutMargins属性,需要重写-layoutMarginsDidChange 方法,以便当边距改变时能刷新你的view

因为tableView和cell是UIView的子类,都有这个layoutMargins属性,所以在iOS8时需要设置两步LayoutMarginsSeparatorInset才能实现分割线全屏效果。

同时官方解释对preservesSuperviewLayoutMargins(维持父控件的布局边距)属性的说明,也正好能说明网上另一种方法不设置self.tableView.layoutMargins = UIEdgeInsetsZero;而是设置cell.preservesSuperviewLayoutMargins = NO为什么也能起作用。

6. 最后,最简单的方法,设置下面两个属性也可以实现分割线全屏效果

 _tableView.separatorInset = UIEdgeInsetsZero;
 _tableView.layoutMargins = UIEdgeInsetsZero;
 如果还有问题在cellForRowAtIndexPath中添加cell.layoutMargins = UIEdgeInsetsZero;方法,目前我这边测试在tableView中设置上面两个属性可以成功
上一篇下一篇

猜你喜欢

热点阅读