ios - 如何在 Swift 的 maintableviewcell 中访问内部 tableviewcell 的高度

标签 ios swift uitableview

我是 Swift 的新手,我无法访问主 UITableviewCell 中 UITableviewCell 内部的高度。

在我的主 tableviewcell 中,我在 cellforrowatindexpath 中的代码是这样的:

cell.constraintHeightOfTblView.constant = CGFloat(135 * (cell.arrCourses.count))

我创建了内部 tableview 的高度约束,并根据数组的计数将其相乘。有用。但是,如果单元格中的数据增加,则无法获得正确的高度,因为我在此处定义了静态高度。

所以我想要内部 tableviewcell 高度,以便它可以正常工作。我可以访问它吗?

我想实现这个:

enter image description here

但随着 insidetableviewcell 的内容增加,我得到了这个

enter image description here

内部 tableviewcell 正在滚动我不希望内部 tableview 单元格以不同方式滚动。

最佳答案

此代码的目的是为 tableView 提供适合其内容大小的高度并停止滚动。

以前,这是通过对 tableView 使用高度约束来实现的。

如果您的 tableView 在 Storyboard 或 xib 中,请执行以下步骤:

  1. 创建一个名为 SelfSizedTableView 的 swift 文件。
  2. SelfSizedTableView 提供给 Storyboard 或 xib 中的 tableView。
  3. 无需为tableView提供高度限制。
  4. 只需转到 Size Inspector 到底部并设置 Intrinsic 大小为占位符,不勾选高度和宽度框。

如果您的 tableView 是以编程方式创建的,请确保它是 SelfSizedTableView 的子级。

import UIKit

class SelfSizedTableView: UITableView {

/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
    // Drawing code
}
*/

func defaultSetup() {
    // do something here
}

override open func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    defaultSetup()
}

override init(frame: CGRect, style: UITableView.Style) {
    super.init(frame: frame, style: style)
    defaultSetup()
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    defaultSetup()
}

/// set a value to maxHeight if you want tableView to scroll after a specific height
/// e.g. when contentSize.height > maxHeight
/// table view will start to scroll

var maxHeight: CGFloat?

/// set a value to minHeight if you want tableView to avoid scroll before specific height
/// e.g. when contentSize.height > minHeight
/// table view will start to scroll

var minHeight: CGFloat?

override func reloadData() {
    super.reloadData()
    self.invalidateIntrinsicContentSize()
    self.layoutIfNeeded()
}

override var intrinsicContentSize: CGSize {
    let height: CGFloat
    
    if let maxHeight = maxHeight {
        height = min(contentSize.height, maxHeight)
    }
    else if let minHeight = minHeight {
        height = max(contentSize.height, minHeight)
    }
    else {
        height = contentSize.height
    }
    
    return CGSize(width: contentSize.width, height: height)
}

override func layoutSubviews() {
    super.layoutSubviews()
    invalidateIntrinsicContentSize()
}

关于ios - 如何在 Swift 的 maintableviewcell 中访问内部 tableviewcell 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63393358/

相关文章:

swift - 如何在 NEVPNManager 中 stub 连接属性(NEVPNConnection)?

ios - 如何在值为动态时增加数组的索引(Swift)

ios - 枚举值 'NSFetchedResultsChangeMove' 和 NSFetchedResultsChangeUpdate' 未在开关中处理

ios - Xcode 使查看全屏,隐藏状态栏,导航栏等

ios - 在 iOS 中使用正则表达式进行验证

ios - 只在某些特定的 ViewController 中启用横向

ios - 在 Swift 中执行 Restkit addFetchRequestBlock 以删除孤儿

iphone - (iPad/iPhone) 在屏幕上刷新表格单元格

ios - 当我尝试使用 tableView(moveRowAt :) 重新排序行时,TableView 行高缩小

iphone - 初始化时类型不兼容?