uitableview 内容大小未正确返回 swift

Posted

技术标签:

【中文标题】uitableview 内容大小未正确返回 swift【英文标题】:uitableview content size is not returning correctly swift 【发布时间】:2017-03-09 10:38:11 【问题描述】:

我在容器视图中使用 uitableview,所以想根据内容大小高度设置我的容器高度。 因此,在重新加载 tableview 后,我正在更改容器的高度。但它似乎是根据估计的高度计算的。它没有给出实际高度。

这是我的约束布局。

谢谢..

    instructiontableview.estimatedRowHeight = 55

    instructiontableview.rowHeight = UITableViewAutomaticDimension

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

  

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    // assigning multiline text to my label 


        cell.layoutIfNeeded()
        cell.sizeToFit()
        return cell
    
    return UITableViewCell()

现在我正在从我的容器视图控制器重新加载并更改高度

【问题讨论】:

请同时添加相关代码和约束。 @agent_stack 请检查我更新的问题 您的标签内容正在发生变化,对于该内容,您必须更改单元格高度。我说的对吗?? 【参考方案1】:

我尝试了reloadData()layoutIfNeeded() 并尝试了许多不同的方法。没有什么对我有用。最后我通过使用KVO 解决了它。

这是我的代码

override  func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    self.instructiontableview.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)


override func viewWillDisappear(_ animated: Bool) 
    self.instructiontableview.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
            self.heightofinstructioncontainerview.constant = newsize.height
        
    
 

【讨论】:

赞美上帝免税。 在我尝试了一切之后,这是唯一有效的解决方案。在 ios 13 中有一个错误,其中“tableView.contentSize.height”只是返回错误。观察答案中显示的属性,确实提供了它的真正价值。 不行! ? 这是我能为 iOS 13 找到的唯一解决方案!谢谢一百万! 经过漫长的一天搜索这个问题后,我现在可以睡觉了。这个解决方案就像一个魅力。 非常适合(iOS 13,*)的答案。谢谢。【参考方案2】:

您的大部分方法都是正确的,请在下面添加此步骤。如果您已经完成了任何步骤,请将其标记为复选标记。

    将标签 numberOfLines 属性更改为零

    为标签添加约束

    改变高度约束关系

    实现这两个tableView的委托方法

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
          return 55
    
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
          return UITableViewAutomaticDimension
    
    

现在运行您的项目并检查。

预期输出:

【讨论】:

我没有添加 uilabel heght,除非我做了所有步骤,【参考方案3】:

虽然此处提供的答案是正确的,但这是来自 Apple Developer Forum 的另一种解释,其中指出 contentSize 最初与 estimated 值一样。所以把它归零对我有用。

tableView.estimatedRowHeight = 0

这是来自苹果开发者论坛的答案:

在 iOS 11 中,表格视图默认使用估计高度。这意味着 contentSize 与最初的估计值一样。如果您需要使用 contentSize,您需要通过将 3 个估计高度属性设置为零来禁用估计高度:tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0

【讨论】:

【参考方案4】:

如果您使用的是 iOS 13 和/或 Combine(就像我一样),那么您可以使用 tableview 的 KVO 属性中的发布者

tableView.publisher(for: \.contentSize)
       .receive(on: RunLoop.main)
       .sink  size in
           self.myViewsHeightConstraint.constant = size.height
           self.tableView.isScrollEnabled = size.height > self.tableView.frame.height
       
       .store(in: &cancellables)

这对我来说非常有用,并且在每次布局传递时都会发布新值,如果您在 sink 闭包中放置断点,您可以在设备上实时看到这些值。

【讨论】:

以上是关于uitableview 内容大小未正确返回 swift的主要内容,如果未能解决你的问题,请参考以下文章

返回正确大小的页脚时,部分页脚中的 UITableView 随机白线

在ScrollView中调整了UITableView,内容视图未调整大小

iOS 8 uitableview 调整大小不正确

UITableView 未显示正确的行数

UITableView 单元格内容未正确显示

UITableCell 高度未正确调整