【问题标题】:How to completely hide a UITextView in swift?如何快速完全隐藏 UITextView?
【发布时间】:2021-03-04 17:12:11
【问题描述】:

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

这是我用来调整UITextView 可见性的代码:

if(collapseArray[indexPath.row]){
    cell.noteText?.text = nil
}else{
    cell.noteText?.text = notesArray[indexPath.row]
}

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

这就是我要说的

不隐藏:

隐藏:

如您所见,test 一词下方仍有很大的空间,即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'

【问题讨论】:

  • 隐藏不会改变约束,只会让它不可见。您可能对UIStackView 感兴趣。否则,您可以使用约束来执行此操作。
  • 这看起来像一个 TableView 单元格,对吗?单元格是通过 XIB 构建的还是以编程方式完成的?

标签: swift uiview uilabel uitextview


【解决方案1】:

在您的单元格中,保存对 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 在您的第一个语句时被初始化初始化约束执行。

【讨论】:

  • 我将变量 textViewHeightConstraint 添加到了我的 Cell 类并在 AwakeFromNib 中初始化,但是,我得到了错误:Instance member 'noteText' cannot be used on type 'NoteTableViewCell'
  • 你一定又做了一些语法错误检查
  • 这行得通,但我没有将初始化放在awakeFromNib中,而是将它放在cellForRowAt
  • @david: 嘿抱歉这里是深夜,所以我无法回复,你不应该在cellForRowAt 中初始化它,cellForRowAt 每次滚动单元格时都会被调用,这意味着你将结束up 为每个单元一次又一次地创建新的约束,而不是只创建一次约束。 awakeFromNib 每个单元格只调用一次,这是添加此类约束的理想场所。语句textViewHeightConstraint = noteText.heightAnchor.constraint(equalToConstant: 0) 应该只执行一次,因为你应该保留cell.textViewHeightConstraint.priority =
  • cellForRowAt中,因此我要求将textViewHeightConstraint = noteText.heightAnchor.constraint(equalToConstant: 0)放在awakefromnib中,因为逻辑部分(更新约束优先级cell.textViewHeightConstraint.priority =)应该放在cellForRowAt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2019-07-22
  • 1970-01-01
  • 2011-08-16
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多