iOS 9 UITableView分隔符插入(重要的左边距)

我在iOS 9上的UITableViewCell中的UITableView之间存在分隔符问题。 他们有显着的左边缘。 我已经有了删除iOS 8引入的空格的代码,但它不适用于iOS 9 。 看起来他们加了别的东西。 我想这可能是与layoutMarginsGuide连接,但我还没有弄明白。 有没有人有类似的问题,发现解决scheme?

好的, 我find了解决办法 。 唯一需要的是在UITableView的呈现实例上设置标志cellLayoutMarginsFollowReadableWidth

 myTableView.cellLayoutMarginsFollowReadableWidth = NO; 

我想在文档中find一些参考,但它看起来还没有准备好, 只在diff页面上提到 。

由于该标志是在iOS 9中引入的,因此向后兼容性应该在尝试设置之前添加一个检查:

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

对于Swift 2.0你可以使用#available来检查iOS版本。

 if #available(iOS 9, *) { myTableView.cellLayoutMarginsFollowReadableWidth = false } 

此外,您需要使用Xcode 7或更高版本进行编译。

编辑

请记住,这是唯一的必要的修复,如果你的分隔符看起来“好”,直到iOS 8,否则你需要更多一点。 你可以find信息如何做到这一点已经在SO。

Swift 2.2 iOS 9.3

在viewDidLoad中

 tableView.cellLayoutMarginsFollowReadableWidth = false 

在UITableViewDelegates中

 func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if cell.respondsToSelector(Selector("setSeparatorInset:")){ cell.separatorInset = UIEdgeInsetsZero } if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) { cell.preservesSuperviewLayoutMargins = false } if cell.respondsToSelector(Selector("setLayoutMargins:")){ cell.layoutMargins = UIEdgeInsetsZero } } 

如果你想在界面构build器中做到这一点

在这里输入图像说明

完美的解决scheme达到iOS 9

在viewDidLoad中

 - (void)viewDidLoad { [super viewDidLoad]; //Required for iOS 9 if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) { self.testTableView.cellLayoutMarginsFollowReadableWidth = NO; } } 

在TableViewDelegate方法中添加以下代码:

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

Swift 3.0 / 4.0

 tableView.cellLayoutMarginsFollowReadableWidth = false func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) { cell.separatorInset = UIEdgeInsets.zero } if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } if cell.responds(to: #selector(setter: UIView.layoutMargins)) { cell.layoutMargins = UIEdgeInsets.zero } } 

这在iOS 9中完美适用于我。

对于OBJ-C

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

根据这里的不同答案,我可以用Swift中的这些代码行去除分隔符的差距:

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

但是我仍然在文本之前有这么小的差距:

在这里输入图像说明

接受的答案不适合我。 直到我移动setCellLayoutMarginsFollowReadableWidth之前setLayoutMargins(iOS 8仍然需要):

 if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { _tableView.cellLayoutMarginsFollowReadableWidth = NO; } if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { _tableView.layoutMargins = UIEdgeInsetsZero; } 
 - (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]; } } 

对于iOS 8和9

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero]; if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO]; } 

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

这是我在XCode 8.2.1中的Swift 3.0 / iOS 10的解决scheme。

我已经创build了一个适用于IB的UITableview的子类,并以编程的方式创build了tableviews。

 import UIKit class EXCSuperTV: UITableView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setupView() } override init(frame: CGRect, style: UITableViewStyle) { super.init(frame: frame, style: style) setupView() } func setupView() {} } class EXCNoFooter: EXCSuperTV { override func setupView() { super.setupView() //tableFooterView = UIView.Zero() } } class EXCMainTV: EXCNoFooter { override func setupView() { super.setupView() separatorInset = UIEdgeInsets.zero } }