iOS 8 UITableView分隔符插入0无效

我有一个应用程序,其中UITableView的分隔符插入设置为自定义值-右0,左0。这在iOS 7.x中工作得很好,但是在iOS 8.0中,我看到分隔符被设置为右侧的15的默认值。即使在xib文件中它设置为0,它仍然显示错误。

我如何删除UITableViewCell分隔边距?

186943 次浏览

Arg ! !在你的Cell子类中做这些事情后:

- (UIEdgeInsets)layoutMargins
{
return UIEdgeInsetsZero;
}

或者设置cell.layoutMargins = UIEdgeInsetsZero;为我修复了它。

在Swift中,这有点烦人,因为layoutMargins是一个属性,所以你必须重写getter 而且 setter。

override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}

这将有效地使layoutMargins变为只读,在我的情况下这很好。

我相信这也是我在这里问的同一个问题:Remove SeparatorInset在iOS 8 UITableView为XCode 6 iPhone模拟器

iOS 8中,从UIView继承的所有对象都有一个新属性。因此,在ios7中设置SeparatorInset的解决方案。x将不能删除你在iOS 8中UITableView上看到的空白。

新属性名为“layoutMargins”。

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

iOS 8 UITableView setSeparatorInset:UIEdgeInsetsZero setlayoutmargin:UIEdgeInsetsZero

解决方案:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{


if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}


if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}

如果你设置了cell.layoutMargins = UIEdgeInsetsZero;而没有检查layoutMargins是否存在,应用程序将在iOS 7.x上崩溃。因此,最好的方法是检查layoutMargins是否在setLayoutMargins:UIEdgeInsetsZero之前存在。

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

这个属性在iOS 7.0上是不可用的,所以你需要确保你在分配它之前检查!

简单的解决方法是子类化单元格并覆盖@user3570727所建议的layout margin属性。然而,你将失去任何系统行为,如从安全区继承边缘,所以我不建议以下解决方案:

(ObjectiveC)

-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}

迅速(4.2):

override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }

如果不想重写该属性,或者需要有条件地设置它,请继续阅读。


除了layoutMargins属性之外,Apple还在单元格中添加了财产,以防止它继承表视图的边距设置。设置此属性后,允许单元格独立于表视图配置它们自己的边距。把它看作是一个重写。

这个属性叫做preservesSuperviewLayoutMargins,将它设置为NO将允许单元格的layoutMargin设置覆盖TableView上的layoutMargin设置。它既节省时间(你不需要修改表视图的设置),也更简洁。详情请参考Mike Abdullah的回答。

注意:以下是单元格级边缘设置的干净实现,如Mike Abdullah的回答所示。设置单元格的preservesSuperviewLayoutMargins=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];
}
}

斯威夫特4:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}

将单元格上的preservesSuperviewLayoutMargins属性设置为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];
}
}

斯威夫特4:

func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}

...好了!这应该适用于iOS 7和8。


你可能需要设置表视图的cellLayoutMarginsFollowReadableWidthNO,如果你想自定义插入或页边距。您的里程可能会有所不同,这不是很好的记录。

此属性只存在于iOS 9中,所以在设置之前一定要检查。

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}

斯威夫特4:

if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}

(以上代码来自iOS 8 UITableView分隔符插入0无效)

编辑:这是一个纯接口生成器的方法:

TableViewAttributesInspector # EYZ0 < / p >

注意:iOS 11的变化&简化了这种行为,一个更新即将到来…

至于cdstamper建议的表格视图,在单元格的layoutSubview方法中添加以下行对我来说是可行的。

- (void)layoutSubviews
{
[super layoutSubviews];


if ([self respondsToSelector:@selector(setSeparatorInset:)])
[self setSeparatorInset:UIEdgeInsetsZero];


if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
{
[self setPreservesSuperviewLayoutMargins:NO];;
}


if ([self respondsToSelector:@selector(setLayoutMargins:)])
{
[self setLayoutMargins:UIEdgeInsetsZero];
}
}

迅速:

override func viewDidLoad() {
super.viewDidLoad()


if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}
if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}


self.tableView.layoutIfNeeded()            // <--- this do the magic
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...


if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}


return cell
}

大多数答案都显示分隔符和布局边距是通过各种方法(即viewDidLayoutSubviewswillDisplayCell等)设置的单元格和表视图,但我发现,只是把这些放在cellForRowAtIndexPath工作得很好。似乎是最干净的方法。

// kill insets for iOS 8
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
cell.preservesSuperviewLayoutMargins = NO;
[cell setLayoutMargins:UIEdgeInsetsZero];
}
// iOS 7 and later
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
[cell setSeparatorInset:UIEdgeInsetsZero];

使用下面的代码片段避免不必要的填充问题UITableView在IOS 8 &7.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{


if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}


if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}

这是在Swift中为我工作的代码:

override func viewDidLoad()
{
super.viewDidLoad()
...
if tableView.respondsToSelector("setSeparatorInset:") {
tableView.separatorInset = UIEdgeInsetsZero
}
}


func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset.left = CGFloat(0.0)
}
if tableView.respondsToSelector("setLayoutMargins:") {
tableView.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins.left = CGFloat(0.0)
}
}

这对我来说似乎是最干净的(目前),因为所有的单元格/tableView边缘/边缘调整都是在tableView:willDisplayCell:forRowAtIndexPath:方法中完成的,而不是在tableView:cellForRowAtIndexPath:中填充不必要的代码。

顺便说一句,我只是设置单元格的左separatorInset/ layoutmargin,因为在这种情况下,我不想搞砸我在单元格中设置的约束。

代码更新到Swift 2.2:

 override func viewDidLoad() {
super.viewDidLoad()


if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
tableView.separatorInset = UIEdgeInsetsZero
}
}


override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector(Selector("setSeparatorInset:")) {
cell.separatorInset.left = CGFloat(0.0)
}
if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
tableView.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector(Selector("setLayoutMargins:")) {
cell.layoutMargins.left = CGFloat(0.0)
}
}

在盲目地试图解决问题之前,让我们花点时间来了解一下这个问题。

在调试器中快速查找会告诉您分隔行是UITableViewCell的子视图。似乎单元格本身对这些线条的布局负有相当大的责任。

iOS 8引入了布局的利润率的概念。默认情况下,视图的布局边距为8pt,而祖先视图的边距为继承了

正如我们所能告诉的,当布局分隔线时,UITableViewCell选择尊重左侧布局边距,使用它来约束左侧的插图。

把所有这些放在一起,为了实现真正为零的理想插入,我们需要:

  • 设置左侧布局边距为0
  • 停止任何继承的边缘覆盖它

这样说来,这是一个相当简单的任务:

cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;

注意事项:

  • 这段代码在每个单元格中只运行一次需要(毕竟您只是在配置单元格的属性),当您选择执行它时并没有什么特别之处。做你觉得最干净的事。
  • 遗憾的是,这两个属性都不能在Interface Builder中配置,但是如果需要,您可以为preservesSuperviewLayoutMargins指定用户定义的运行时属性。
  • 显然,如果你的应用针对的是更早的操作系统版本,你需要避免执行上述代码,直到在iOS 8及以上版本上运行。
  • 而不是设置preservesSuperviewLayoutMargins,您可以配置祖先视图(如表)也有0左边距,但这似乎本质上更容易出错,因为您没有控制整个层次结构。
  • 如果只将左侧空白设置为0,而其他空白保持不变,可能会稍微干净一些。
  • 如果你想在UITableView在普通样式表底部绘制的“额外”分隔符上插入一个0,我猜这也需要在表级别指定相同的设置(还没有尝试过这个!)

而不是每次单元格滚动时更新preservesSuperviewLayoutMarginslayoutMargins(使用willDisplayCell),我建议在cellForRowAtIndexPath:中做一次:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)


cell.preservesSuperviewLayoutMargins = false
cell.layoutMargins = UIEdgeInsetsZero


return cell


}

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

这个属性在iOS 7.0中不可用,所以你需要确保在分配它之前检查!

但是,苹果已经添加了一个名为preservesSuperviewLayoutMargins财产到你的单元格,这将阻止它继承你的表视图的边距设置。这样,单元格可以独立于表视图配置它们自己的边距。把它看作是一个重写。

这个属性叫做preservesSuperviewLayoutMargins,将它设置为NO可以让你用你自己的单元格的layoutMargin设置来覆盖你的表格视图的layoutMargin设置。它既节省时间(你不需要修改表视图的设置),也更简洁。详情请参考Mike Abdullah的回答。

注意:这是正确的,较少混乱的实现,如Mike Abdullah的回答所示;设置你的单元格的preservessuperviewlayoutmargin =NO将确保你的表格视图不会覆盖单元格设置。

第一步-设置单元格边距:

/*
Tells the delegate that the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Remove separator inset
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}


// Prevent the cell from inheriting the Table View's margin settings
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}


// Explictly set your cell's layout margins
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
}

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

第二步——只有在所有失败的情况下,你才可以强制使用你的表视图边距:

/*
Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()


// Force your tableview margins (this may be a bad idea)
if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}


if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}
}

...好了!这应该可以在iOS 8和iOS 7上运行。

注意:使用iOS 8.1和7.1进行测试,在我的情况下,我只需要使用本解释的第一步。

第二步只需要在渲染的单元格下面有未填充的单元格。如果表的行数大于表模型中的行数。不执行第二步将导致分隔符偏移量不同。

让我们做我的代码:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}


if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
cell.preservesSuperviewLayoutMargins = NO;
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}

我是这样做的:

tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;

你可以使用一次UIAppearance,在你的应用程序启动时(在UI被加载之前),把它设置为默认的全局设置:

// iOS 7:
[[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];


[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];


// iOS 8:
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {


[[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];


}

这样,你可以保持你的UIViewController的代码干净,如果你想重写它。

我浏览了所有这些精彩的答案,发现其中大多数都不能在iOS 8上运行,或者可以工作,但分隔符在动画期间改变大小,导致不必要的闪烁。这是我在创建窗口之前在我的应用委托中所做的事情:

[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];


if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
[[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}

这是我添加到UITableViewController的:

-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];


if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}

我不需要再添加任何东西了。感谢所有提供关键信息的人。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ... Get the cell
cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20);
// others
return cell;
}

对于要隐藏分隔符的任何特定单元格。

Lukasz用Swift回答:

    // iOS 7:
UITableView.appearance().separatorStyle = .SingleLine
UITableView.appearance().separatorInset = UIEdgeInsetsZero
UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero


// iOS 8:
if UITableView.instancesRespondToSelector("setLayoutMargins:") {
UITableView.appearance().layoutMargins = UIEdgeInsetsZero
UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
}

简单的解决方案在斯威夫特 iOS 8自定义UITableViewCell

override func awakeFromNib() {
super.awakeFromNib()


self.layoutMargins = UIEdgeInsetsZero
self.separatorInset = UIEdgeInsetsZero
}

通过这种方式,您只需设置layoutMarginseparatorInset一次,而不是像上面大多数答案所建议的那样为每个willDisplayCell设置一次。

如果你使用自定义UITableViewCell,这是正确的地方。 否则你应该在tableView:cellForRowAtIndexPath.

只是另一个提示:您不需要设置preservesSuperviewLayoutMargins = false,因为默认值已经是NO!

以一种比大多数人投票的答案更紧凑的方式……

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {


if ([cell respondsToSelector:@selector(setSeparatorInset:)] && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)] && [cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setPreservesSuperviewLayoutMargins:NO];
[cell setLayoutMargins:UIEdgeInsetsZero];
}

在iOS8:

添加这个到我的UITableViewCell子类:

- (UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero;
}

和这个到"tableView:cellForRowAtIndexPath"或"tableView:willDisplayCell":

[editCell setSeparatorInset:UIEdgeInsetsZero];

对我有用。

以上的解决方案我都没有什么运气。我正在为我的表格单元格使用NIB文件。我通过添加一个高度为1的标签来“修复”这个问题。我把标签的背景改为黑色,把标签钉在笔尖的底部,然后把剩下的内容钉在添加的标签上。现在我在单元格的底部有了一条黑色边框。

对我来说,这感觉更像是一种黑客,但它确实有效。

我唯一的选择就是完全消除边界。我还没决定要不要这么做。

iOS 8及更高版本。Swift 2.0及更高版本:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
if #available(iOS 8.0, *) {
cell.layoutMargins = UIEdgeInsetsZero
} else {
// Fallback on earlier versions
}
}

在看完三楼的答案后,我试图弄清楚在TableView和amp之间设置分隔符是什么关系;TableViewCell做了一些测试。以下是我的结论:

  1. 我们可以认为,将单元格的分隔符设置为零必须分两步移动分隔符:第一步是将单元格的separatorinset设置为零。第二步是将单元格的marginlayout设置为零。

  2. 设置TableView的separatorinsetmarginlayout可以影响Cell的separatorinset。然而,从测试中,我发现TableView的separatorinset似乎是无用的,TableView的marginlayout实际上可以影响cell的marginlayout

  3. 设置Cell的preservessuperviewlayoutmargin = false,可以切断TableView的marginlayout对Cells的影响。

  4. 其中一个解决方案:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()
    
    
    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
    
    
    return cell
    }
    

添加这个片段,简单优雅的Swift适用于我在iOS8:)

    // tableview single line
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.preservesSuperviewLayoutMargins = false
cell.layoutMargins = UIEdgeInsetsZero
}

这就是我的解。这适用于自定义单元格子类,只需将它们都添加到子类。

  1. - (UIEdgeInsets) layoutmargin {
    返回UIEdgeInsetsMake(0,10,0,10);
    }
    < /代码> < / pre > < /李>
    

2.

self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10);

而且很方便,你可以自定义分隔符的位置,而不需要你的设计师为你画一个..........

Swift 2.0扩展

我只是想分享一个扩展,我做了删除边缘从tableview单元格分隔符。

extension UITableViewCell {
func removeMargins() {


if self.respondsToSelector("setSeparatorInset:") {
self.separatorInset = UIEdgeInsetsZero
}


if self.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
self.preservesSuperviewLayoutMargins = false
}


if self.respondsToSelector("setLayoutMargins:") {
self.layoutMargins = UIEdgeInsetsZero
}
}
}

用于上下文中:

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell


cell.removeMargins()
return cell

对于iOS 9,你需要添加:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}

更多详情请参考问题

这在我的iOS 8和iOS 9系统中运行得非常好。

为# EYZ0

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}


if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}


if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
return cell;
}

下面是来自@cdstamper的回答,一个更好的地方是UITableViewCell的layoutSubviews,在你的单元格文件中(我设置了1%的间距,你可以设置为零),所以只需要在这里设置代码来处理所有情况(旋转和其他):

 -(void)layoutSubviews
{
[super layoutSubviews];
if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
[self setSeparatorInset:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
}
if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
[self setLayoutMargins:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
}
}

这里有一个简单的方法全局删除嵌入。

在# EYZ0:

import UIKit


extension UITableViewCell {


override public var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set { }
}


}

AppDelegate application:didFinishLaunchingWithOptions::

  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero

您可能会认为a)也只是在扩展中覆盖separatorInset,或者b)为layoutMargins设置外观代理。这两种方法都行不通。即使separatorInset被指示为属性,尝试将其作为属性(或方法)重写也会产生编译器错误。并且为UITableViewCelllayoutMargins设置外观代理(或者,为此,也为UITableViewlayoutMarginsseparatorInset设置外观代理)没有效果。

XCode 7.1 iOS 7,8,9:

把这两行放到你的TabelViewCell中:

    self.layoutMargins = UIEdgeInsetsZero;
self.preservesSuperviewLayoutMargins = false;

这对我很有用

我的解决方案是添加一个UIView作为单元格子视图的容器。然后设置这个UIView约束(顶部,底部,尾部,前导)为0点。所有不必要的质量都消失了

对我来说,简单的线条就够了

cell.layoutMargins = UIEdgeInsetsZero

enter image description here

使用storyboard更改分隔符插入自定义左0和右0, 如果你想隐藏分隔符为None 见上图

以# EYZ0

创建# EYZ0

import UIKit


extension UITableViewCell {
func removeMargins() {


if self.respondsToSelector(Selector("setSeparatorInset:")) {
self.separatorInset = UIEdgeInsetsZero
}


if self.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
self.preservesSuperviewLayoutMargins = false
}


if self.respondsToSelector(Selector("setLayoutMargins:")) {
self.layoutMargins = UIEdgeInsetsZero
}
}
}

现在你可以在cellForRowAtIndex中使用

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.removeMargins()//To remove seprator inset
}

在Swift中你可以使用这个

    cell.selectionStyle = UITableViewCellSelectionStyle.None
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero

经过大量调查……

这是我能找到的完全控制这些东西的唯一方法

完全控制每个单元格上的分隔符插入和布局边距。在UITableviewDelegate上的willDisplayCell方法中执行此操作。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.layoutMargins = UIEdgeInsetsZero
cell.contentView.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10)
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}

cell对象控制分隔符,contentView控制其他一切。如果你的分隔符插入空间显示在一个意想不到的颜色,这应该解决它:

cell.backgroundColor = cell.contentView.backgroundColor

只需添加下面的代码就可以解决这个程序。

祝你好运!

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {


if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}


if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}


}

Swift 3.0示例:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// removing seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// prevent the cell from inheriting the tableView's margin settings
if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// explicitly setting cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}

简单地把这两行放在cellForRowAtIndexPath方法中

  • 如果你想让所有分隔线从0开始 (细胞setSeparatorInset: UIEdgeInsetsZero); 李[细胞setLayoutMargins: UIEdgeInsetsZero]; < / >

如果你想特定的分隔线是从0开始假设这是最后一行是从0开始

if (indexPath.row == array.count-1)
{
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
else
tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);

对我来说,除了这个变通方法(斯威夫特3.0)之外,其他方法都不起作用:

extension UIColor {
static func colorWith(hex:String, alpha: CGFloat) -> UIColor {
var cString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()


if cString.hasPrefix("#") {
cString.remove(at: cString.startIndex)
}


if cString.characters.count != 6 {
return UIColor.gray
}


var rgbValue:UInt32 = 0
Scanner(string: cString).scanHexInt32(&rgbValue)


return UIColor(red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8)  / 255.0,
blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
alpha: alpha)
}
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdendifier, for: indexPath)


cell.backgroundColor = UIColor.colorWith(hex: "c8c7cc", alpha: 1) // same color of line separator


return cell
}

只需重写cellForRowAtIndexPath并设置cell。preservessuperviewlayoutmargin = false" and "cell。separatorInset = UIEdgeInsets。零”和“单元格”。layoutmargin = uiedgeinsets . 0 "

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


let cell: LayoutTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "LayoutCell") as? LayoutTableViewCell






let currentLayout = OrderLayouts()[indexPath.row]


cell.NameLabel?.text = currentLayout.name
cell.DescrLabel?.text = currentLayout.descr


if(GlobalVariables.debug){


cell.DescrLabel?.text = "\(currentLayout.id) \n \(currentLayout.descr)"


}


cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero




return cell


}