【问题标题】:How to dynamically resize xib according to UITextView如何根据 UITextView 动态调整 xib 的大小
【发布时间】:2023-03-17 23:40:01
【问题描述】:

我正在使用自动布局。

  • 我正在从 xib 加载 UIView
  • UITextView 之外的所有元素都具有静态大小。
  • 我已禁用 UITextView 上的滚动
  • UITextView 在ViewDidLoad() 上填充了不同大小的文本。例如,它可以是 1 行或 7 行。

我正在使用以下方法加载此 UIView:

fileprivate func setTableHeaderView() {
    guard let _headerView = UINib(nibName: "TableHeaderView",
                                 bundle: nil).instantiate(withOwner: self, options: nil)[0] as? UIView else { return }

    tableView.tableHeaderView = UIView(frame:
        CGRect(x: 0, y: 0, width: tableView.frame.width, height: _headerView.frame.size.height))

    configureViewController() // here I set the text for UITextView
    tableView.tableHeaderView?.addSubview(_headerView)
}

当我加载这个UIView 时,layoutSubviews 之前和之后的高度总是相同的。实际上大小总是等于在 XCode 的 Size Inspector 中设置的 xib 的初始大小。

我想 UITextView 以适应文本大小并具有不同的 xib UIView 大小,这取决于 UITextView + 所有其他元素 + 约束的大小。

我尝试了不同的方法来实现这一点,但都没有帮助。我试过的:

  • 以不同方式设置约束
  • 强制调用 layoutSubviews() 并检查结果 UIView 的大小
  • 在 viewDidLayoutSubviews 之后检查 UIView 的大小
  • translatesAutoresizingMaskIntoConstraints = trueautoresizingMask = .flexibleHeight

这样的想法可以实现吗?

【问题讨论】:

  • 你需要一个 UITextView 吗?你需要有用户输入吗?如果不是这样,你最好使用 UILabel。
  • @Fogmeister 不,我并不完全需要 UITextView,你认为 UILabel 会帮助 UIView 从 xib 调整大小吗?
  • UITextView 被设计为在它包含的文本太大时滚动。文本视图的大小与其中的文本大小无关。使用 UIlabel,标签的固有大小是文本的大小,它应该调整视图的大小。
  • @Fogmeister 我已经在 UITextView 上禁用了滚动功能,因此在固有尺寸的情况下它的工作方式与 UILabel 相同
  • 尝试使用此代码collindonnell.com/2015/09/29/…

标签: ios objective-c swift xcode autolayout


【解决方案1】:

尝试覆盖 viewDidLayoutSubviewsMethod

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Dynamic sizing for the header view
    if let headerView = tableView.tableHeaderView {
        let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        var headerFrame = headerView.frame

        // If we don't have this check, viewDidLayoutSubviews() will get
        // repeatedly, causing the app to hang.
        if height != headerFrame.size.height {
            headerFrame.size.height = height
            headerView.frame = headerFrame
            tableView.tableHeaderView = headerView
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2010-09-08
    • 2014-03-30
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多