在iOS 8 UITableView的XCode 6 iPhone模拟器上删除SeparatorInset

我在XCode 6 GM上的UITableView for iPhone 6 Simulator (iOS 8)上发现了一个奇怪的空白区域。 我已经尝试从故事板和代码都设置SeparatorInset ,但白色空间是直到那里。

以下代码适用于iOS 7,但不适用于iOS 8(iPhone 6模拟器)。

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

我附上下面的截图:

iPhone 6模拟器奇怪的白色空间在tableview上

顺便说一句,我正在使用AutoLayout。 我希望有人可以告诉我一个方法来删除TableView上奇怪的空白。

感谢学生指出我正确的方向与评论“ 试试这self.myTableView.layoutMargins = UIEdgeInsetsZero ;” 这行代码只能在iOS 8上工作,因为layoutMargins只能在iOS 8上使用。如果我在iOS 7上运行相同的代码,它将会崩溃。

 @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 

在这里输入图像描述

下面是通过设置tableview layoutMarginscell layoutMarginsUIEdgeInsetsZero如果存在的话)(iOS 8)来解决这个奇怪的空白的正确答案。 而且它也不会在iOS 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]; } } 

请参阅下面的屏幕截图:

在这里输入图像描述

尝试创build一个UITableViewCell类别类别并添加此getter

 - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsZero; } 

在iOS7中,这将不会被称为COS在SDK中没有这个属性,并不会导致任何崩溃;在iOS8中,这将被称为每次使用单元格

它适用于我

我的解决scheme只有三行代码:

 -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)row{ // // ... your code ... // if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){ cell.layoutMargins = UIEdgeInsetsZero; cell.preservesSuperviewLayoutMargins = false; } return cell; } 

IOS8引入了一个名为“ configuration内容边距”的新概念,还介绍了一个名为layoutMargins的新属性,有关该属性的详细信息,请参阅Apple Doc。 layoutMargins的types是UIEdgeInsets ,默认值是{8,8,8,8}。 要除去IOS8中的TableView的分隔符行,除了设置tableView.seperatorInset = UIEdgeInsetsZero ,还必须执行下列操作:

首先定义macros

 #define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) 

在UITableViewDelegate方法中添加:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *reuseId = @"cellReuseID" ; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId]; if(!cell){ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId]; if(isIOS8SystemVersion){ cell.layoutMargins = UIEdgeInsetsZero; cell.preservesSuperviewLayoutMargins =NO ; } } 

做这些将删除分隔线。 你也可以做如下:

  UITableView *tableView = [[UITableView alloc] init]; if(isIOS8SystemVersion){ tableView.layoutMargins = UIEdgeInsetsZero ; } 

并在UITableViewDelegate方法中添加:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *reuseId = @"cellReuseID" ; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId]; if(!cell){ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId]; if(isIOS8SystemVersion){ cell.layoutMargins = UIEdgeInsetsZero; } } 

在我的情况下,在Xcode 6.2中,除了Will Q的回答,我必须去Main.storyboard>selectUITableViewCell>属性检查器。 将“分隔符”下拉列表从“默认插入”更改为“ 自定义插入” 。 将左侧插入从15更改为0。

在这里输入图像描述

iOS 7和iOS 8的解决方法

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.separatorInset = UIEdgeInsetsMake(0.0f, cell.frame.size.width, 0.0f, 0.0f); } 

在iOS8中,您必须在行和表级别上设置插入。

cellForRowAtIndexPath中的行级别:

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

viewDidLoad中的表级别:

 [tableReference setSeparatorInset:UIEdgeInsetsZero]; 

之后,清理你的项目是一个好主意。 在某些情况下,我注意到这些更改不是直接在模拟器中的可执行应用程序中引入的。

对于iOS 8

尝试通过设置cell.layoutMargins = UIEdgeInsetsZero;cellForRowAtIndexPath方法中

如果你想删除白线,但保持分隔符插图,只需将cell.backgroundColor设置为tableView backgroundColor。 只要设置cell.contentView.backgroundColor不会使问题消失。

我已经尝试了很多方法,但都没有工作,但是这个方法对我很有用。

为我工作

为了让iOS7和iOS8的UITableView分隔符为零,而不是在代码中进行更改,请通过更改View-> Mode-> Aspect Fill来更改UITableView的xib。

为iPhone 6和Plus添加启动图像。 在添加图像之前,手机以缩放模式运行,也就是说较旧的应用会缩放以适应新的屏幕尺寸。 这可能是导致线路。 新的图像是Retina HD 5.5(iPhone6Plus)1242×2208和Retina HD 4.7(iPhone6)750×1334。

请参阅iOS 8 UITableView分隔符插图0不起作用

基本上,你需要设置cell.layoutMargin以及tableView的layoutMargin。 YMMV,但我必须在layoutSubviews中设置表格视图才能工作!

我有静态的UITableView并希望将单元格分隔符的边距移到左边缘。

感谢上面的答案,这是我的解决scheme

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // needed to shift the margin a specific cell to the left edge if indexPath.section == 3 && indexPath.row == 0 { cell.layoutMargins = UIEdgeInsetsZero cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0) } }