Xcode 7 iOS 9 UITableViewCell分隔符插入问题


67

这不是问题,而是我所面临问题的解决方案。

在Xcode 7中,当该应用程序在iPad设备上的iOS 9上运行时,UITableViewCell在的左侧留有一些空白UITableView。将设备旋转到地面会增加边距。

我找到的解决方案是:

设定cellLayoutMarginsFollowReadableWidthNO

self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO;

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

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


是的,这完美的作品对我来说特别是在iPad上的iOS 9
阿德里安锄头

我刚刚遇到此问题的严重问题,它使用version 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 2016年

1
参见stackoverflow.com/questions/32845075/…以获得更好的方法,检测功能而不是iOS9版本号
Brad Thomas

Answers:


39

iOS 9及更高版本:

这是因为有一个称为可读内容指南的新功能。它提供适合阅读的边距。因此,在iPhone和人像iPad上,它们的利润很小。但是从景观来看,iPad更大。在iOS 9中,UITableViewCell边距默认遵循可读内容指南。

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

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


2
很好的答案!遗憾的是它尚未被记录。这个问题是在我准备矿井的时候
朱利安·克罗尔(JulianKról),2015年

13

最高iOS 9

在viewDidLoad中

物镜

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

物镜

- (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 2015年

1
这不适用于iOS9。您是否已在首选项中使用正确设置的命令行工具对iOS 9和Xcode 7进行了测试?
朱利安·科洛(JulianKról),2015年

如果使用的是swift,则应使用if #available(iOS 9.0, *)状态检查。
2015年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.