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

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

对于iOS7:

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

对于iOS8:

首先configuration你的表格视图如下:

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

然后在你的cellForRowAtIndexPath:方法中,configuration单元格如下:

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

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

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

在这里输入图像说明

在这里输入图像说明

如果你想支持iOS的老版本,你应该在调用之前检查这个方法的可用性:

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

弄清楚了。

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

选定的答案不适合我。 但是,这是的,它从ios 2.0的作品:

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

Swift版本

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

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

然而,苹果已经添加了一个**属性到你的单元格,这将阻止它inheritance你的表视图的边距设置。 这样,您的单元格可以独立于表视图configuration自己的边距。 把它看作是一个重载。

这个属性被称为preservesSuperviewLayoutMargins ,将其设置为NO可以让您使用自己的单元格的layoutMargin设置覆盖TableView的layoutMargin设置。 这既节省时间( 你不必修改表视图的设置 ),而且更简洁。 请参阅Mike Abdullah的答案以获得详细的解释。

注意:正如迈克·阿卜杜拉(Mike Abdullah)的回答所expression的那样,这是正确的,不那么杂乱的实现。 设置你的单元格的保留SuperviewLayoutMargins =否将确保你的表视图不会覆盖单元格设置。

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

 /* 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 } } 

将单元格上的保留视图布局放置属性设置为“否” 防止表格视图覆盖单元格边距。 在某些情况下,它似乎不能正常工作。

第二步 – 只有在全部失败的情况下,才可能暴力破坏你的表格视图边距:

 /* 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.1testing,在我的情况下,我只需要使用这个解释的第一步。

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

对于应用程序范围内的永久解决scheme,请在应用程序中调用:didFinishLaunching ..任何tableview都将“固定”

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

而在iOS 8中,基于Seth McFarlane的post,你需要开始处理layoutMargins。 以下为我做了:

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

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

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

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

在这里输入图像说明

同时,我有一个小的解决方法来实现这一点。 我只是在细胞上划线。 创buildUITableViewCell的子类并重写drawRect方法。 另外不要忘记将UITableView的分隔符属性设置为None。 这是代码。 它在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) } 

重置separatorInset为我修复这个问题:

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

解决scheme:

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

当心设置tableView的separatorInset为UIEdgeInsetsZero似乎同时打破了节标题的左边距! (至less它在iOS 7.1上)

如果你想用tableView:titleForHeaderInSection:来显示段落标题,并且仍然得到UITableViewCells之间没有换行符的效果,那么你必须直接在单元格中设置separatorInset而不是tableView!

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

对于iOS8 +这为我工作,

 tableView.layoutMargins = UIEdgeInsetsZero 

并在cellForRowAtIndexPath方法中:

 cell.layoutMargins = UIEdgeInsetsZero; 
 - (void)viewDidLoad { [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; [super viewDidLoad]; // Additional setup } 

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

 @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的答案是完美的。

到iOS8及以上

如果你发现所有的解决scheme都不能像我一样工作,我想你可能已经使用了UITableViewCell的子类并且重写了layoutSubviews方法,如果你满足了两个条件,请继续阅读。

做或一步一步检查。

1,在alloc和init UITableView ,设置它的layoutMargins属性。

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

2,在方法- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ,在alloc和init后自定义UITableViewCell ,设置其layoutMargins属性。

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

3,最重要的部分进来。如果你重写UITableViewCell的- (void)layoutSubviews方法, 不要忘记调用它的超级

 - (void)layoutSubviews { [super layoutSubviews] ; // layout the subviews } 

Xamarin.iOS版本

我在iOS 8.4的Xamarin.iOS中使用了Luis E. PradoKing-Wizard的post帮助,将UITableView分隔符扩展为全angular。 我必须设置SeparatorInset和LayoutMargins才能使它工作。 我没有写更低的iOS版本的检查,因为我的目标是iOS 8及以上版本。

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

UITableView的

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

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

的UITableViewCell

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

 public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell) { tableViewCell.SeparatorInset = UIEdgeInsets.Zero; tableViewCell.LayoutMargins = UIEdgeInsets.Zero; tableViewCell.PreservesSuperviewLayoutMargins = false; }