UITableViewCell的分割线|多种方式

作者: 岁与禾 | 来源:发表于2016-08-07 23:20 被阅读4014次

2016年8月7日

UITabViewCell自定义分割线

在UITableView的使用中,通常需要设置分割线。但是分割线会经常短一截的情况,针对这个情况,有三种方式可以解决。

1 自定义UIView充当分割线

实现原理,自定义CMTableViewCell继承自UITableViewCell,使用懒加载创建高度为1的UIView,重写layoutSubViews布局UIView的位置。

自定义cell的.m文件

@interface CMTableViewCell ()

@property(nonatomic,weak) UIView *separatorView;

@end

@implementation CMTableViewCell

//使用懒加载创建分割线view,保证一个cell只有一条
-(UIView *)separatorView
{
    if (_separatorView == nil) {
        UIView *separatorView = [[UIView alloc]init];
        self.separatorView = separatorView;
        separatorView.backgroundColor = [UIColor redColor];
        [self addSubview:separatorView];
    }
    return _separatorView;
}

//重写layoutSubViews方法,设置位置及尺寸
-(void)layoutSubviews
{
    [super layoutSubviews];
    self.separatorView.frame = CGRectMake(0, self.bounds.size.height-1,     self.bounds.size.width, 1);
}

2 修改系统属性--主要是系统适配

iOS6的时候cell的分割线是屏幕宽的,但是现在不是了,向右缩进了一些距离

iOS7的时候,苹果对tableView增加了一个叫separatorInset的东西,会改变分割线的边距

iOS8,内部增加一些自动布局的东西,我们可以在storyboard添加约束的时候可以感受到,每次添加约束的时候,都会勾掉一个叫constraint to margins的选项。--所以这个我们需要注意

所以,我们可以通过修改这些属性得到答案

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //都是针对tableView来看
    //1 去除掉自动布局添加的边距
    self.tableView.layoutMargins = UIEdgeInsetsMake(0, 0, 0, 0);
    //2 去掉iOS7的separatorInset边距
    self.tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);

}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];

    }
    cell.textLabel.text = @"haha";
    //去掉cell的自动布局添加的边距
    cell.layoutMargins = UIEdgeInsetsMake(0, 0, 0, 0);
    return cell;
}

3 巧妙利用TableView的背景作为分割线---万能方式

这个方式的巧妙之处在于,保持每个cell的位置不变,也就是坐标仍然位置系统自动计算好的,调整cell的高度,让后边的tableView露出来,利用tableView的背景色作为分割线。

关键点:tableView的cell,在初始化的时候frame就已经全部计算好了,当cell即将显示的时候会调用setFrame方法来给cell赋值,所以,我们就可以重写setFrame方法拦截,修改frame里面的height,达到目的。

CMTableViewCell.m文件

- (void)viewDidLoad {
[super viewDidLoad];

    //1 禁用系统自带的分割线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    //2 设置tableView的背景色跟系统自带的背景色一致 198 198 203
    self.tableView.backgroundColor = [UIColor colorWithRed:198/255.0 green:198/255.0 blue:203/255.0 alpha:1];

    //3 重写cell的setFrame的方法-在自定义cell中设置
}

CMTableCell.m文件

//3 重写setFrame方法
-(void)setFrame:(CGRect)frame
{
    //只修改高度
    frame.size.height-=1;
    //调用系统方法设置
    [super setFrame:frame];
}

相关文章

网友评论

  • L了个Y:第二个没看懂,楼主能解释下么?
    岁与禾:@文刀洋 之前在iOS6的时候,分割线其实是全屏的。在iOS7的时候,增加了一个边距的属性,导致分割线向右边挪动了,所以,我们为了让分割线仍然全屏,需要将这个边距恢复。另外,iOS8的时候由于自动布局的影响,又有一个属性需要我们关闭掉。
  • 无夜之星辰:可以,很强势

本文标题:UITableViewCell的分割线|多种方式

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