Xcode 7 iOS 9 UITableViewCell 分割线缩进问题

67

这不是一个问题,而是我遇到的问题的解决方案。

在Xcode 7中,当应用程序在iPad设备上运行iOS 9时, UITableViewCell 会在 UITableView 的左侧留下一些边距。并且将设备旋转到横向会增加边距。

我找到的解决方案是:

cellLayoutMarginsFollowReadableWidth 设置为 NO

self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO;

此属性仅在iOS 9中可用。因此,您将不得不设置条件来检查iOS版本,否则它会崩溃。

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

有相同的问题 - Julian
是的,这对我来说非常完美,特别是在搭载iOS 9的iPad上。 - Adrian Hoe
我刚刚遇到了一个严重的问题,这个答案使用的是版本NSFoundationVersionNumber_iOS_8_1,它需要使用NSFoundationVersionNumber_iOS_8_4,否则将会导致在运行iOS8.2、iOS8.3和IOS8.4的应用程序崩溃。 - Alex
我曾经使用 float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 来获取我的系统版本,这样你就可以轻松地与 if (version >= 9.0) 进行比较(并且避免由于同一iOS版本的进一步更新而导致潜在崩溃)。 - zbMax
1
请参考以下链接以获取更好的方法,该方法检测功能而非iOS9版本号:https://dev59.com/qFwY5IYBdhLWcg3wPVtS - Bradley Thomas
4个回答

39

iOS 9及以上版本:

这是由于一项名为“可读内容指南”的新功能。它提供适合阅读的边距。所以,在iPhone和竖屏iPad上,它们的边距非常小。但是在iPad横向屏幕上,它们更大。在iOS 9中,默认情况下UITableViewCell边距遵循可读内容指南。

如果您想停止这个功能,只需将tableView的cellLayoutMarginsFollowReadableWidth设置为NO/false即可。

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


2
非常好的答案!遗憾的是它还没有被记录下来。那个问题出现在我准备自己的问题时。我的问题链接 - Julian

13

至iOS 9版本

在viewDidLoad中

Objective-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方法中添加以下代码:

Objective-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? - Julian
如果您正在使用Swift,则应该使用if#available(iOS 9.0,*)条件检查。 - GoodSp33d

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

注意:在上面的代码中,底部和顶部的锚点使用contentView而不是readableContentGuide,以便内容的垂直边距根据tableView.rowHeight更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接