iOS 8 UITableView分隔符插入0不工作

我有一个应用程序,UITableView的分隔符插入设置为自定义值-右0,左0。这在ios7.x中非常有效,但是在ios8.0中,我看到右侧的分隔符插入设置为默认值15。即使在xib文件中它被设置为0,它仍然显示不正确

如何删除UITableViewCell分隔符页边距

iOS 8.0在单元格和表视图上引入了layoutMargins属性。

此属性在iOS 7.0上不可用,因此您需要确保在分配它之前进行检查

简单的解决方法是按照@user3570727的建议,对单元格进行子类化并覆盖布局边距属性。但是,您将失去任何系统行为,例如从安全区域继承边距,因此我不推荐以下解决方案:

(目的)

-(UIEdgeInsets)布局边距{
返回UIEdgeInsetsZero//覆盖任何页边距公司安全区域
}

(swift 4.2):

覆盖变量layoutMargins:UIEdgeInsets{get{return.zero}set{}

如果不希望重写该属性,或需要有条件地设置它,请继续读取


除了layoutMargins属性外,Apple还向您的单元格添加了一个属性,以防止其继承表视图的边距设置。设置此属性后,单元格可以独立于表视图配置其自己的页边距。将其视为一种覆盖

此属性称为preservesPerViewLayoutMargins,将其设置为NO将允许单元格的layoutMargin设置覆盖在TableView上设置的任何layoutMargin。它既节省了时间(您不必修改表视图的设置),又更加简洁。请参考迈克·阿卜杜拉的答案以了解详细解释

注意:下面是一个单元格级边距设置的干净实现,如Mike Abdullah的回答所示。设置单元格的preserveSPerViewLayoutMargins=NO将确保表视图不会覆盖单元格设置。如果您确实希望整个表视图具有一致的页边距,请相应地调整代码。

设置单元格边距:

-(void)tableView:(UITableView*)tableView将显示单元格:(UITableViewCell*)用于rowatindexpath的单元格:(nsindepath*)indepath
{
//拆下分离器插件
if([cell respondsToSelector:@selector(setSeparatorInset:)])){
[单元设置分离器设置:UIEdgeInsetsZero];
}
//阻止单元格继承表视图的边距设置
if([cell respondsToSelector:@selector(setPreserveSPerViewLayoutMargins:)])){
[单元格设置保留PerviewLayoutMargins:否];
}
//明确设置单元格的布局边距
if([cell respondsToSelector:@selector(setLayoutMargins:)])){
[单元格设置布局边距:UIEdgeInsetsZero];
}
}

Swift 4:

func tableView(tableView:UITableView,willDisplay单元格:UITableView单元格,forRowAt indexPath:indexPath){
//拆下分离器插件
if cell.responses(到:#选择器(setter:UITableViewCell.separatorInset)){
cell.separatorInset=.0
}
//阻止单元格继承表视图的边距设置
if cell.responses(到:#选择器(setter:UITableViewCell.preservesPerviewLayoutMargins)){
cell.preservesPerViewLayoutMargins=false
}
//明确设置单元格的布局边距
if cell.responses(响应:#选择器(setter:UITableViewCell.layoutMargins)){
cell.layoutMargins=.0
}
}

将单元格上的preservesPerviewLayoutMargins属性设置为NO应该可以防止表视图覆盖单元格边距。在某些情况下,它似乎不能正常工作

如果全部失败,您可以强制执行表视图边距:

-(void)视图显示布局子视图
{
[超级视图布局子视图];
//强制使用tableview页边距(这可能是个坏主意)
if([self.tableView respondsToSelector:@selector(setSeparatorInset:)])){
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if([self.tableView respondsToSelector:@selector(setLayoutMargins:)])){
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
} 

Swift 4:

func viewDidLayoutSubviews(){
super.viewDidLayoutSubviews()
//强制使用tableview页边距(这可能是个坏主意)
if tableView.responses(to:#选择器(setter:UITableView.separatorInset)){
tableView.separatorInset=.0
}
if tableView.responses(to:#选择器(setter:UITableView.layoutMargins)){
tableView.layoutMargins=.0
}
}

…就这样!这应该适用于iOS 7和iOS 8


编辑:Mohamed Saleh提请我注意iOS 9中可能的更改。如果要自定义插图或页边距,您可能需要将表视图的单元格布局页边距设置为。您的里程数可能会有所不同,但没有很好的记录

此属性仅存在于iOS 9中,因此请确保在设置之前进行检查

如果([myTableView响应选择器:@selector(setCellLayoutMarginsFollowReadableWidth:))
{
myTableView.cellLayoutMarginsFollowReadableWidth=否;
} 

Swift 4:

如果myTableView.Responses(响应:#选择器(setter:self.cellLayoutMarginsFollowReadableWidth)){
myTableView.cellLayoutMarginsFollowReadableWidth=false
}

(iOS 8 UITableView分隔符插入0中的上述代码不工作)

编辑:这里有一个纯界面生成器方法:

注意:iOS 11的变化;简化了许多这类行为,即将进行更新…

发表评论