【问题标题】:get height of a tableView获取 tableView 的高度
【发布时间】:2021-08-13 10:23:15
【问题描述】:

我在顶部的标签之间有一个 tableView(约束:对齐中心 x,顶部对齐 20)。

底部有一个按钮(约束:对齐中心 x,底部对齐到 50)。

tableView 在这两个对象之间按顶部/底部对齐到 20。

我试图读出 tableView 的高度,因为根据我使用的设备,高度应该不同? 但如果我在我的代码中使用以下代码,我总是会得到相同的 tableView 高度。

打印结果总是616。

我遗漏了什么/没有正确理解?

 @IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    print(tableView.frame.size.height)
}

【问题讨论】:

  • 我认为自动布局会自动处理它。

标签: swift uitableview


【解决方案1】:

试试这个方法

override func viewWillLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(tableView.frame.size.height)
}

您看到打印了两个不同值的原因是因为在 viewdidload 之后立即调用此方法,并且在应用了视图上的所有自动布局或自动调整大小计算之后再次调用此方法。这意味着每次视图大小发生变化并重新计算视图布局时都会调用 viewDidLayoutSubviews 方法。

有关更多信息,请参阅
Apple documentation on viewdidlayoutsubviews

【讨论】:

  • 我现在明白了。但是我想根据tableView的高度来计算单元格的行高。为了完全填满空间,无论我使用哪种设备,但计算似乎很“晚”,每当视图出现时,我可以看到单元格具有不同的高度,然后计算它,然后它变化。知道我怎样才能更早地获得高度吗?
  • 你能分享你为单元格指定高度的代码吗?
  • 好吧,我现在刚刚将代码粘贴到 viewWillLayoutSubviews 中: override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() tableView.rowHeight = tableView.frame.size.height / CGFloat(playerNames.count) }
  • 或者您可以将tableView.frame.size.height / CGFloat(playerNames.count) 添加到tableview的heightforrowat委托方法中,我认为这会更合适。
【解决方案2】:

试着增加你的身高

override func viewWillLayoutSubviews() {
    print(tableView.frame.size.height)
}

【讨论】:

  • 谢谢!这有帮助。但由于某些原因,我现在得到两个打印语句,一次是 616,然后是较小的数字。为什么会这样?
【解决方案3】:

当您的视图控制器是从情节提要中创建时,所有初始帧都与您选择的情节提要相同,因此它们仅对情节提要中选择的设备是正确的

第一次访问真实帧是在第一个layoutSubviews之后,所以你需要这个:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(tableView.frame.size.height)
}

查看更多关于视图生命周期here

附言较新的当您覆盖某些东西时忘记调用super. 方法,您可能很容易破坏某些东西。除非文档这么说或者你真的知道你在做什么

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多