我有一个应用程序,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的变化;简化了许多这类行为,即将进行更新…