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

时间:2013-08-21 18:29:59

标签: uitableview ios7

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

17 个答案:

答案 0 :(得分: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;
}

注意:包括 layoutMargins separatorInset ,以支持两个iOS版本

答案 1 :(得分:44)

您还可以在故事板中设置“分隔符插入”:

enter image description here

enter image description here

答案 2 :(得分:37)

如果您想支持旧版本的iOS,请在调用之前检查此方法的可用性:

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

答案 3 :(得分:16)

想出来。

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

答案 4 :(得分:9)

所选答案对我不起作用。但这是肯定的,它适用于ios 2.0:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

答案 5 :(得分:9)

Swift版本

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

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

但是,Apple已向您的单元格添加了**属性,这将阻止其继承您的表格视图的边距设置。这样,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。

此属性称为 preservesSuperviewLayoutMargins ,将其设置为NO可以允许您使用自己的单元格layoutMargin设置覆盖表格视图的layoutMargin设置。它既节省了时间(您不必修改表格视图的设置),而且更简洁。有关详细解释,请参阅Mike Abdullah的答案。

注意:正如Mike Abdullah的回答所表达的那样,这是正确的,不那么混乱的实现;设置单元格的preserveSuperviewLayoutMargins = 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 ,以防止表格视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。

第二步 - 只有全部失败后,您才可以强制执行表格视图边距:

/*
    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测试,在我的情况下,我只需要使用此解释的第一步。

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

答案 6 :(得分:8)

对于应用程序范围内的永久解决方案,请在应用程序中调用它:didFinishLaunching ..任何tableview都将“修复”

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

答案 7 :(得分:7)

在iOS 8中,基于Seth McFarlane帖子here,你需要开始处理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];
      }
    }
    

答案 8 :(得分:6)

在iOS 8中,似乎有一个小错误。分隔符插入的自定义值不会应用于包含文本的单元格。我尝试从界面构建器和代码设置它,但都没有工作。我也提交了一份错误报告。

enter image description here

与此同时,我有一个小的解决方法来实现这一目标。我只是在细胞上绘制线条。创建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)
}

答案 9 :(得分:4)

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

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

答案 10 :(得分: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];
   }
}

答案 11 :(得分:2)

注意将tableView的separatorInset设置为UIEdgeInsetsZero似乎同时打破了节标题的左边距! (至少在iOS 7.1上会这样做)

如果你想用tableView:titleForHeaderInSection显示部分标题:并且仍然得到UITableViewCells之间没有换行的欲望效果,你必须直接在单元格而不是tableView上设置separatorInset!

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

答案 12 :(得分:1)

对于 iOS8 + ,这对我有用,

tableView.layoutMargins = UIEdgeInsetsZero

并在cellForRowAtIndexPath方法中:

cell.layoutMargins = UIEdgeInsetsZero;

答案 13 :(得分:0)

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

    [super viewDidLoad];

    // Additional setup
}

注意:setSeparatorStyle行必须高于超级调用。

答案 14 :(得分: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

对于UITableviewCell,威廉的answer非常完美。

答案 15 :(得分: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,最重要的部分是。如果你覆盖UITableViewCell的- (void)layoutSubviews方法,不要忘记调用它的超级

- (void)layoutSubviews
{
    [super layoutSubviews] ;

    // layout the subviews
}

答案 16 :(得分:0)

Xamarin.iOS版本

我在iOS 8.4上的Xamarin.iOS中扩展了UITableView分隔符的全部宽度,并得到了 Luis E. Prado King-Wizard 的帖子的帮助。我必须设置SeparatorInset和LayoutMargins才能使它工作。我没有为较低的iOS版本编写支票,因为我的目标是iOS 8及更高版本。

我编写了以下两个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;
}