如何根据 UITextView 动态调整 xib 的大小

Posted

技术标签:

【中文标题】如何根据 UITextView 动态调整 xib 的大小【英文标题】:How to dynamically resize xib according to UITextView 【发布时间】:2017-07-17 17:24:46 【问题描述】:

我正在使用自动布局。

我正在从 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/… 【参考方案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
        
    

【讨论】:

以上是关于如何根据 UITextView 动态调整 xib 的大小的主要内容,如果未能解决你的问题,请参考以下文章

基于 UITextView 动态调整 CGRect 的大小

动态调整 UITextView 的宽度和高度

如何动态调整 UITextView 的高度

如何根据内容调整 UITextView 的大小?

动态调整自定义 xib 单元格的大小

根据内容字体大小动态调整 UIWebView 的大小