首页 > 解决方案 > 使用 UIButton 扩展 UITextView 而不是根据内容自动扩展

问题描述

我有一个 UITextView,它嵌入在 UIView 中,而许多其他 UIView 都在 UIScrollView 中(本质上是一种形式)。而不是 textView 自动扩展内容,我有一个按钮,我希望用户能够单击并展开/折叠 textView。

这是我所拥有的:

var textViewIsExpanded: Bool = false {
    didSet {
        if self.textViewIsExpanded {
            self.expandTextViewButton.isSelected = true
            guard self.myTextView.contentSize.height > 70 else { return }
            self.myTextView.isScrollEnabled = false
            self.myTextView.translatesAutoresizingMaskIntoConstraints = true
            self.myTextView.sizeThatFits(CGSize(width: self.scrollView.width - 24, height: CGFloat.greatestFiniteMagnitude))
        } else {
            self.expandTextViewButton.isSelected = false
            self.myTextView.isScrollEnabled = true
            self.myTextView.translatesAutoresizingMaskIntoConstraints = false
        }
    }
}

@IBAction func expandTextViewButtonTapped(_ sender: UIButton) {
    textViewIsExpanded.toggle()
}

我已经尝试.sizeToFit()过代替.sizeThatFits(...)哪种工作,但它调整了宽度和高度的大小,我只是想扩展/折叠高度。我猜这是正确实施 CGSize 和/或 IB 约束的问题,但我无法找到一个我想要的解决方案。

标签: iosswiftxcodeuitextviewsizetofit

解决方案


首先,.translatesAutoresizingMaskIntoConstraints在真假之间切换是个坏主意。

您可能想要的是将您的文本视图的高度约束设置为 70... 将其连接到@IBOutlet...,然后切换.isActive该约束。

其次,如果你只有一行文本,那么内容大小高度可能是30,然后你调用

textViewIsExpanded = true

您的代码原样将设置textViewIsExpanded为 true 但将保留为.isScrollEnabledtrue ——因此它不会真正被“扩展”。

第三,您需要通过调用让自动布局知道您正在更改文本视图的大小调整行为:

self.myTextView.invalidateIntrinsicContentSize()

切换后.isScrollEnabled

因此,为您的文本视图的高度约束添加并连接一个属性:

@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!

并尝试将您的代码更改为:

var textViewIsExpanded: Bool = false {
    didSet {
        if self.textViewIsExpanded {
            // if contentSize.height is less-than 71
            //  reset to false
            if self.myTextView.contentSize.height < 71 {
                self.textViewIsExpanded = false
                return
            } else {
                self.expandTextViewButton.isSelected = true
                self.myTextView.isScrollEnabled = false
                self.textViewHeightConstraint.isActive = false
            }
        } else {
            self.expandTextViewButton.isSelected = false
            self.myTextView.isScrollEnabled = true
            self.textViewHeightConstraint.isActive = true
        }
        self.myTextView.invalidateIntrinsicContentSize()
    }
}

推荐阅读