【问题标题】:UITableViewCell not sizing properly on iPhone X running iOS 11UITableViewCell 在运行 iOS 11 的 iPhone X 上无法正确调整大小
【发布时间】:2018-01-07 20:31:37
【问题描述】:

我有一个UITableViewCell,里面只包含一个标签。标签被限制在单元格的所有边距(顶部、底部、尾随和前导)。它是一个多行标签 (lines = 0) 并且有一些静态文本,它将在 iPhone X 的屏幕上以横向和纵向占据多行。

这是 IB 的 screenshot,带有约束条件。

代码中的行数设置为 30。(足够的单元格始终占据屏幕)

我已经在一个新项目中实现了上述所有内容。大部分是在 IB 上完成的,UITableViewController 子类只包含两个方法,numberOfRowsInSectioncellForRowAt indexPath。该项目是在 Xcode 9 上使用 Swift 4 创建的,并且设备在 iOS 11.2 上运行。

这是UITableViewController 子类的代码

class ViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        return cell
    }
}

VC 首次启动时,所有单元格的大小都已正确调整。在将设备旋转为横向时,单元格会按预期调整大小。现在,当我将设备转回纵向时,单元格占据的高度超出了应有的高度

这只发生在 iPhone X 上。这些单元格在所有其他 iPhone 上都按预期布局。

此外,我的任何旧项目(使用 Xcode 8 创建)都不会发生这种情况。

When the VC launches

After rotating to landscape and back

我一直在尝试复制旧项目中的所有属性,但它的大小仍然不正确。

任何意见将不胜感激... 谢谢!

编辑:

正如 Brandon 所指出的,它只发生在 UITableViewController 嵌入到 UINavigationController 中时。嵌入在UINavigationController 中的UIViewController 中的UITableView 显示了正确的行为。 UITableViewControllerUINavigationController 之外的行为也符合预期。

【问题讨论】:

  • 没有代码,没有答案..我们无法猜测您的代码中发生了什么..至少提供一个示例,以便我们可以重现该问题。
  • 我已经添加了 IB 的截图和代码。这应该为您提供足够的信息来重新创建我所面临的。

标签: ios iphone ios11 xcode9 iphone-x


【解决方案1】:

嗯.. 我能够 100% 的时间重现这个.. 这非常奇怪,因为如果 UITableViewController 没有嵌入到 UINavigationController 中,那么一切正常.. 它嵌入的第二个,它展示了您的帖子中显示的行为..

为了修复它,我做了:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)
}

它可以工作,但始终不理想地重新加载.. 还没有找到另一个解决方案.. 到目前为止,它只发生在 UINavigationController 中嵌入的 UITableViewController 中。. @987654326 不会发生@ inside UIViewController 嵌入在UINavigationController.. 它非常特定于表控制器。

这对我来说似乎是一个错误。我检查了几乎所有情节提要参数,但没有找到任何解决方案。

【讨论】:

  • 我同意;这听起来像是 UIKit 中的一个错误。
  • 是否应该将其视为错误并报告给苹果?
  • 我在 UIViewController 中有一个 tableview 嵌入在 UINavigationController 中,当在 iPhonex 中旋转时,tableview 的标题消失了,委托方法 titleForHeader 没有被调用。
【解决方案2】:

似乎使用

if #available(iOS 11.0, *) {
    view.insetsLayoutMarginsFromSafeArea = false
}

在类似情况下可能会有所帮助。

我不知道细节,但可能是 UIKit 中的错误导致布局边距由于安全区域而变得不正确(目前在 iPhone X 上是特殊的)。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。 UITableView 中的单元格在滚动时会改变高度,但仅限于 iPhone X。

    这个问题显然与 iPhone X 的安全区域有关。我的表格单元格包含一个集合视图 - 故事板/界面构建器中的集合视图单元格已选中这两个安全区域框(可能是默认情况下):

    取消选中它们会导致约束使用“超级视图”而不是“安全区域”,并且表格单元格在滚动时不再调整大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多