有没有办法使iOS 7中的UITableView单元格在分隔符中没有换行符?


68

我注意到,在iOS 7中,UITableViewCells在iOS 6没有的单元格分隔符中有一个换行符。有没有办法摆脱这个换行符?将分隔符更改为none,然后使用分隔符的颜色制作UIViews仍然会导致白色分隔符的发生。

Answers:


116

对于iOS7:

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

对于iOS8:

首先,如下配置表视图:

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

然后在cellForRowAtIndexPath:方法中,按以下方式配置单元:

if ([cell respondsToSelector:@selector(layoutMargins)]) {
    cell.layoutMargins = UIEdgeInsetsZero;
}

注意:同时包含layoutMarginsspacerInset,以支持两个iOS版本


我应该用哪种方法写这行?对我不起作用。
Kaptain

在ViewDidLoad方法中添加它。有用。如果要使表视图成为iOS7ish,也可以更改插图。
Bms270 2013年

2
ty更新您的答案
Jenson 2014年

1
我发现我需要两个上面给出的iOS8上的iOS7和iOS8上的零件。
克里斯·普林斯

5
更新:如果在中设置layoutMargins,iOS 8修复程序将起作用viewDidLayoutSubviews。如果将其设置为viewDidLoad类似值,则无法使用。我已经编辑了答案,这样很清楚。
克里斯·诺莱特

44

您还可以从情节提要中设置“分隔符插入”:

在此处输入图片说明

在此处输入图片说明


1
对于在UIView或UIViewController父级中具有UITableView的用户,您不会看到上面的图像,但是如果您检查.xib中的UITableView,则将看到“分隔符插入”设置为“默认”。选择“自定义”并将左或右更改为0。换句话说,不要浪费时间尝试所有其他这些东西!通过IB设置插图
。– whyoz

2
听起来不错,但对我不起作用。我创建了一个新项目,将其拖入TVC中,将其设置为根VC,并将左插图更改为0。知道为什么吗?nobre的解决方案(如下)对我有用。
mkc842

谢谢!你节省了我很多时间。
瑞安·沃尔顿

37

如果要支持旧版本的iOS,则应在调用此方法之前检查该方法的可用性:

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

这是安全的,如果你的目标不是iOS6的还有
尤努斯内迪姆Mehel

如何在iOS6中获取此信息?
thatzprem

16

弄清楚了。

[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];

1
这也为我工作。顺便说一下,我不明白为什么分隔符会中断。在我的应用程序的一个表视图中,同一分隔符行是双精度行,而其他分隔符是单行。为什么-不知道。
Valeriy Van

对于空白表格视图,它确实对我有用。但我自定义的可重复使用的细胞分离器仍然是默认的
Karan Alangat

9

选择的答案对我不起作用。但这是肯定的,并且可以在ios 2.0中使用:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

2
仅当您根本不需要分隔符时,它才是好。
克里斯·普林斯

不,那是如果您根本不想要任何样式,那就是他想要的。
anasaitali 2014年

那不能回答问题。
King-Wizard

9

迅捷版

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

此属性在iOS 7.0中不可用,因此您需要确保在分配前检查一下!

但是,Apple向您的单元格添加了**属性,这将阻止它继承您的Table View的边距设置。这样,您的单元格可以独立于表格视图配置其自己的边距。将其视为替代。

此属性称为preservesSuperviewLayoutMargins,并将其设置为NO可以允许您使用自己单元格的layoutMargin设置覆盖Table View的layoutMargin设置。既节省时间(您无需修改​​表视图的设置),又更加简洁。请参阅Mike Abdullah的回答以获取详细说明。

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

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

/*
    Tells the delegate 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 seperator 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
    }
}

将单元格上的preservesSuperviewLayoutMargins属性设置为NO应该可以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运行。

第二步-仅当所有操作失败时,才可以蛮力使用Table View边距:

/*
    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上进行了测试,在我的情况下,我只需要使用此说明的第一步。

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


8

对于应用范围内的永久解决方案,请在application:didFinishLaunching中调用此方法。任何表视图都将被“修复”

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
  [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}

7

在iOS 8中,根据此处的Seth McFarlane帖子,您需要开始处理layoutMargins。以下为我做到了:

  1. 在ApplicationDidFinishLaunching中,运行以下命令:

    if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
        [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
    }
    
  2. 在UITableView上创建以下类别:

    @interface UITableView(WJAdditions)
    -(void) wjZeroSeparatorInset;
    @end
    
    @implementation UITableView (WJAdditions)
    -(void) wjZeroSeparatorInset {
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
      if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
        self.layoutMargins = UIEdgeInsetsZero;
      }
    #endif
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
       if ([self respondsToSelector: @selector(setSeparatorInset:)])
          self.separatorInset = UIEdgeInsetsZero;
       }
    #endif
    }
    @end
    
  3. 在初始化后不久,在您的UITableViews中,调用

    [self wjZeroSeparatorInset];
    
  4. 在您的UITableViewControllers中,您需要以下内容:

    -(void) viewWillLayoutSubviews {
      [super viewWillLayoutSubviews];
      UITableView* tv = self.tableView;
      if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
        [tv setLayoutMargins:UIEdgeInsetsZero];
      }
    }
    

6

在iOS 8中,似乎有一个小错误。分隔符插入的自定义值不会应用于其中包含文本的单元格。我尝试通过界面生成器和通过代码进行设置,但均无效果。我也提交了错误报告。

在此处输入图片说明

同时,我有一个小的解决方法可以实现这一目标。我只是在单元格上画线。创建的子类UITableViewCell并覆盖该drawRect方法。同样不要忘记将的分隔符属性设置UITableView为无。这是代码。它在Swift中,但是由于它基本上是C语言,因此您也可以在Objective-C中使用相同的东西。

override func drawRect(rect: CGRect) {
    super.drawRect(rect)

    let context = UIGraphicsGetCurrentContext()
    CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
    CGContextSetLineWidth(context, 2) // separator width

    CGContextMoveToPoint(context, 0, self.bounds.size.height)
    CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
    CGContextStrokePath(context)
}

谢谢。CGContextSetLineWidth(context, 1)更接近默认值,以防万一有人想要更“香草”的外观
迈克尔·迈克尔(Michael

4

重置spacerInset为我解决了这个问题:

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

如果您也未定位ios6,则这样做会更安全。
Yunus Nedim Mehel 2014年

3

解决方案:

-(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];
   }
}

2

当心,将tableView的spacerInset设置为UIEdgeInsetsZero似乎同时打破了节标题的左边距!(至少在iOS 7.1上如此)

如果要显示带有tableView:titleForHeaderInSection:的部分标题,并且仍然希望UITableViewCells之间没有换行符,则必须直接在单元格而不是tableView上设置spacerInset!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...
    [cell setSeparatorInset:UIEdgeInsetsZero];


0
- (void)viewDidLoad
{
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

    [super viewDidLoad];

    // Additional setup
}

注意:setSeparatorStyle行必须在超级调用之上。


那不能回答问题。
King-Wizard

0
@implementation UITableView (HGApperance) 
-(void)setSeparatorXMargin:(CGFloat)margin{
    // iOS 7
    if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
        [self setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self respondsToSelector:@selector(layoutMargins)]) {
        self.layoutMargins = UIEdgeInsetsZero;
    }
}
@end

对于TableviewCell,Willam的答案非常完美。


0

到iOS8及更高版本

如果您发现所有解决方案都不像我那样工作,那么我认为您可能使用了的子类UITableViewCell并覆盖了该layoutSubviews方法,如果满足两个条件,请继续阅读。

逐步进行或检查。

1,分配并初始化后UITableView,设置其layoutMargins属性。

if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    _tableView.layoutMargins = UIEdgeInsetsZero ;
}

2,在方法中- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath,在分配并初始化您的自定义后UITableViewCell,设置其layoutMargins属性。

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

3,最重要的部分进来了。如果重写- (void)layoutSubviewsUITableViewCell的方法,请不要忘记调用它的super

- (void)layoutSubviews
{
    [super layoutSubviews] ;

    // layout the subviews
}

0

Xamarin.iOS版本

我从帖子帮助延长Xamarin.iOS的UITableView中分离全宽在iOS 8.4路易斯·E.普拉多景向导。我必须同时设置SeparatorInset和LayoutMargins才能使其正常工作。由于我的目标是iOS 8及更高版本,因此我没有为较低的iOS版本编写支票。

我编写了以下两种C#扩展方法,以在UITableView或UITableViewCell级别设置UITableView分隔符的全角。您可以根据需要的效果使用这两种方法中的一种或两种(请参阅下面的说明)。

UITableView

设置UITableView属性以更改在空单元格后出现的分隔符。可以从相关的ViewController的ViewDidLoad方法中调用此SetLayoutMarginsZero方法。

public static void SetLayoutMarginsZero(this UITableView tableView)
{
    tableView.SeparatorInset = UIEdgeInsets.Zero;
    tableView.LayoutMargins = UIEdgeInsets.Zero;
}

UITableViewCell

设置UITableViewCell属性以更改在填充单元格后出现的分隔符。可以从TableViewSource GetCell方法中调用此SetLayoutMarginsZero方法。

public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell)
{
    tableViewCell.SeparatorInset = UIEdgeInsets.Zero;
    tableViewCell.LayoutMargins = UIEdgeInsets.Zero;
    tableViewCell.PreservesSuperviewLayoutMargins = false;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.