【问题标题】:Get Height of Table Contents in Swift在 Swift 中获取表格内容的高度
【发布时间】:2016-10-28 08:51:12
【问题描述】:

我正在尝试获取表格所有内容的高度,以便更新它所在的容器。这将允许容器和滚动视图中的其他视图一起滚动。

【问题讨论】:

标签: ios xcode swift uitableview


【解决方案1】:

斯威夫特

var tableViewHeight: CGFloat {
    tableView.layoutIfNeeded()

    return tableView.contentSize.height
}

Objective-C

- (CGFloat)tableViewHeight {
    [tableView layoutIfNeeded];

    return [tableView contentSize].height;
}

【讨论】:

  • 我认为根据 tableview 内容高度设置高度不是好方法,因为它取决于您何时获取表格内容高度...如果您在重新加载表格后立即调用此方法,那么可能你可能会得到错误的内容大小
【解决方案2】:

斯威夫特 3

override func viewDidLoad() {
    super.viewDidLoad()

    myTbleView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    myTbleView.removeObserver(self, forKeyPath: "contentSize")
    super.viewWillDisappear(true)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if(keyPath == "contentSize"){
        if let newvalue = change?[.newKey]
        {
            let newsize  = newvalue as! CGSize
           tableViewHeightConstraint.constant = newsize.height
        }
    }
}

希望这会对你有所帮助。

【讨论】:

  • 这段代码工作起来很神奇,但我有一个问题,我在同一个视图控制器中有两个 tableview,然后这段代码为两个 tableview 设置了相同的高度。那么有没有其他方法可以单独获取tableview的高度。
  • if (object as!UITableView) == firstTableView {} else if (object as!UITableView) == secondTableView {}
  • 谢谢!我认为最好在 viewWillAppear 中添加观察者,如果您以模态方式呈现另一个视图控制器或有标签栏等,您将删除观察者而不是在返回时添加它。该功能将不再存在,并且在尝试删除未添加的观察者时应用程序将崩溃。
  • 它的工作,但我只是通知你的观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用观察者调用执行这么多时间。
  • 我认为创建一个仅在您的数据加载时触发的自定义通知将解决问题,上述方法有效,但它会多次调用观察者......它可能会导致您的应用程序结结巴巴。
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2012-10-18
  • 2013-09-04
相关资源
最近更新 更多