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

时间:2017-07-17 17:24:46

标签: ios objective-c swift xcode autolayout

我正在使用自动布局。

  • 我正在从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

是否有可能以这种方式实现这个想法?

1 个答案:

答案 0 :(得分: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
        }
    }
}