如何在 swift 中完全隐藏一个 UITextView?

How to completely hide a UITextView in swift?

我在 UIView 中有一个 UITextView,我希望用户能够通过点击它来显示和隐藏它。 UITextView 和每边 10 的约束。当前,当用户点击视图时,文本确实会消失,但是您仍然可以看到 UITextView 在哪里,因为 UITextView 所在的位置大约有一行 space。

这是我用来调整 UITextView:

可见性的代码
if(collapseArray[indexPath.row]){
    cell.noteText?.text = nil
}else{
    cell.noteText?.text = notesArray[indexPath.row]
}

我已经尝试设置 .isHidden 属性,但我得到了相同的结果。当我使用 UILabel 时,我能够得到想要的结果,但是我希望文本是可编辑的。

这就是我所说的

未隐藏:

隐藏:

正如你所看到的,在单词 test 下面还有一个很大的 space,这是一个 UILabel,它的约束条件一直都是 10。

这是我用于下面给定答案的代码:

class NoteTableViewCell: UITableViewCell, UITextViewDelegate {
    
    @IBOutlet weak var noteTitle: UILabel!
    @IBOutlet weak var noteText: UITextView!
    @IBOutlet weak var cardView: UIView!
    
    var textViewHeightConstraint: NSLayoutConstraint!
    
    override class func awakeFromNib() {
        textViewHeightConstraint = noteText.heightAnchor.constraint(equalToConstant: 0)
        textViewHeightConstraint.priority = .defaultLow
        textViewHeightConstraint.isActive = true
    }
}

但是这给了我错误:

Instance member 'noteText' cannot be used on type 'NoteTableViewCell'

在你的单元格中,保存对 textView 高度约束的引用 var textViewHeightConstraint: NSLayoutConstraint!,可能在 awakefromNib 中,注意常量为 0 且优先级较低

        textViewHeightConstraint = noteText.heightAnchor.constraint(equalToConstant: 0)
        textViewHeightConstraint.priority = .defaultLow
        textViewHeightConstraint.isActive = true

按照你的逻辑,切换约束的优先级

if(collapseArray[indexPath.row]){
    cell.textViewHeightConstraint.priority = .required //this should set textView height to 0
}else{
    cell.textViewHeightConstraint.priority = .defaultLow //this should set it back
}
cell.textViewHeightConstraint.isActive = true
cell.layoutIfNeeded()

编辑:

由于 OP 在 awakeFromNib 中面临初始化约束 属性 的问题,我正在更新下面的答案

class NoteTableViewCell: UITableViewCell, UITextViewDelegate {

    @IBOutlet weak var noteTitle: UILabel!
    @IBOutlet weak var noteText: UITextView!
    @IBOutlet weak var cardView: UIView!

    var textViewHeightConstraint: NSLayoutConstraint!

    override func awakeFromNib() {
        super.awakeFromNib()
        textViewHeightConstraint = noteText.heightAnchor.constraint(equalToConstant: 0)
        textViewHeightConstraint.priority = .defaultLow
        textViewHeightConstraint.isActive = true
    }
}

您应该使用 override func awakeFromNib() 而不是 override class func awakeFromNib() 并且您应该在继续并初始化约束之前调用 super.awakeFromNib()super.awakeFromNib() 将确保您的 IBOutlets 在您执行第一个初始化约束的语句时初始化。