2015-07-21 59 views
67

这不是问题,而是我遇到的问题的解决方案。Xcode 7 iOS 9 UITableViewCell分隔符插入问题

在Xcode 7中,当应用程序在iPad设备上的iOS 9上运行时,UITableView单元格会在tableview的左侧留下一些空白。将设备旋转到风景会增加边距。

我找到的解决方案是:

设置 “cellLayoutMarginsFollowReadableWidth” 为NO。

self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO; 

因为,这个属性仅在iOS版9可用,因此,您将不得不把一个条件检查的iOS版本,否则会崩溃。

if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_8_1) 
{ 
    self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO; 
} 

希望对他人有帮助。

+0

[有同样的问题](http://stackoverflow.com/questions/31537196/ios-9-uitableview-separators-significant-left-margin) –

+0

是的,这对我来说非常适合我,尤其是在iOS 9的iPad上 –

+0

我刚刚遇到了一个严重的问题,它使用的版本是'NSFoundationVersionNumber_iOS_8_1',它需要使用'NSFoundationVersionNumber_iOS_8_4',否则会崩溃运行iOS8.2和iOS8.3的应用程序和IOS8.4我使用的IOS8.4 – Alex

回答

13

完美的解决方案的iOS高达9

在viewDidLoad中

目标C

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

夫特

override func viewDidLoad() { 
    super.viewDidLoad() 
    if #available(iOS 9.0, *) { 
     tableViewDiet.cellLayoutMarginsFollowReadableWidth = false 
    } 
    } 

在TableViewDelegate方法添加以下代码:

目标C

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

夫特

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 

    // Remove seperator inset 
    if cell.respondsToSelector(Selector("setSeparatorInset:")) { 
     cell.separatorInset = UIEdgeInsetsZero 
    } 

    // Prevent the cell from inheriting the Table View's margin settings 
    if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) { 
     cell.preservesSuperviewLayoutMargins = false 
    } 

    // Explictly set your cell's layout margins 
    if cell.respondsToSelector(Selector("setLayoutMargins:")) { 
     cell.layoutMargins = UIEdgeInsetsZero 
    } 
    } 
+1

这不适合我。这就是为什么我不得不寻找其他方法。 – stuti

+1

这不适用于iOS 9.您是否已使用iOS 9和Xcode 7在首选项中正确设置了命令行工具来测试它? –

+0

没有。这对我不起作用。 –

38

为iOS 9和上述

这是因为最佳解决方案一个新的featu重新称为可读内容指南。它提供适合阅读的利润率。所以,在iPhone和纵向iPad中,它们的利润率非常小,但在横向iPad上它们更大。在iOS 9中,UITableView的单元边距默认为遵循可读内容指南。

如果您想停止该操作,只需将tableView的cellLayoutMarginsFollowReadableWidth设置为NO/false即可。

来源:https://forums.developer.apple.com/thread/5496

+2

非常好的答案!遗憾的是,它尚未记录。这个问题发生在我准备[我](http://stackoverflow.com/questions/31537196/ios-9-uitableview-separators-insets-significant-left-margin/) –

3

有点晚。我希望是别人有帮助...

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

readableContentGuide是已经加入到每UIView

这是为了保证用户不必把他的头读取布局指南内容。

如果你想跟着可读的内容指南,然后执行以下操作:

let baseSection = UIView() 

contentView.addSubview(baseSection) 

baseSection.translatesAutoresizingMaskIntoConstraints = false 

let insets = UIEdgeInsets(top: 4, left: 0, bottom: 4, right: 0) 

baseSection.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor, constant: insets.left).isActive = true 
baseSection.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor, constant: -insets.right).isActive = true 
baseSection.topAnchor.constraint(equalTo: contentView.topAnchor, constant: insets.top).isActive = true 
baseSection.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -insets.bottom).isActive = true 

注:在底部和顶部锚上面的代码中使用的内容查看,而不是readableContentGuide使得内容垂直利润率变化基于tableView.rowHeight