iOS 8 UITableView分隔符插入0不起作用
我有一个应用程序, UITableView
的分隔符插入被设置为自定义值 - 右0
,左0
。 这在iOS 7.x
完美工作,但在iOS 8.0
我发现分隔符插入在右侧设置为默认值15
。 即使在xib文件中它设置为0
,它仍然显示不正确。
我如何删除UITableViewCell
分隔边距?
iOS 8.0在单元格和表格视图中引入了layoutMargins属性。
此属性在iOS 7.0上不可用,因此您需要确保在分配之前进行检查!
此外,Apple已将一个属性添加到您的单元格,以防止它继承您的表格视图的边距设置。 设置此属性后,您的单元格可以独立于表格视图来配置自己的边距。 把它看作是一种重载。
该属性名为preservesSuperviewLayoutMargins
,将其设置为NO
将允许单元格的layoutMargin
设置覆盖TableView上设置的任何layoutMargin
。 它既节省时间( 您不必修改表视图的设置 ),并且更简洁。 详细解释请参考Mike Abdullah的答案。
注意:接下来是一个干净的实施细胞级别的保证金设置 ,如迈克阿卜杜拉的答案中所表达的。 设置你的单元格的保留SuperviewLayoutMargins = NO将确保你的表视图不会覆盖单元格设置。 如果您确实希望整个表格视图具有一致的边距,请相应地调整您的代码。
设置您的单元格边距:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
将单元格上的保留SuperviewLayoutMargins属性设置为NO 应防止您的表视图覆盖您的单元格边距。 在某些情况下,它似乎无法正常工作。
如果全部失败,您可能会蛮力强制您的表视图边距:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
...你去了! 这应该适用于iOS 7和8。
编辑: Mohamed Saleh让我注意到iOS 9中可能发生的变化。如果您想自定义cellLayoutMarginsFollowReadableWidth
或页边距,您可能需要将Table View的cellLayoutMarginsFollowReadableWidth
为NO
。 你的里程可能会有所不同,这没有很好记录。
此属性仅存在于iOS 9中,因此请务必在设置前进行检查。
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
(上面的代码从iOS 8 UITableView分隔符插入0不工作)
编辑:这是一个纯粹的界面生成器方法:
注意:iOS 11更改并简化了大部分此类行为,即将进行更新...
精氨酸! 在你的Cell
子类中进行这些操作后,
- (UIEdgeInsets)layoutMargins
{
return UIEdgeInsetsZero;
}
或者设置cell.layoutMargins = UIEdgeInsetsZero;
为我修好了。
让我们花点时间在盲目充电之前了解问题,然后尝试解决问题。
在调试器中快速浏览会告诉你分隔线是UITableViewCell
子视图。 看起来单元本身对这些线路的布局承担了相当大的责任。
iOS 8引入了布局边距的概念。 默认情况下,视图的布局边距在所有方面都是8pt
,并且从祖先视图继承。
最好的情况是,在对其分隔线进行布局时, UITableViewCell
选择尊重左侧布局边距,使用它来约束左侧插入边界。
把所有这些放在一起,为了达到真正为零的理想插图,我们需要:
0
像这样,这是一个非常简单的任务:
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
注意事项:
preservesSuperviewLayoutMargins
SupersviewLayoutMargins。 0
左边距,而不是设置preservesSuperviewLayoutMargins
视图边距边界,但由于您无法控制整个层次结构,因此这看起来更具错误倾向。 0
并保留其他值可能会稍微更清晰。 UITableView
在普通样式表底部绘制的“额外”分隔符上有一个0插入,我猜这将需要在表级别指定相同的设置(还没有试过这个!)