ios - 使用 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 约束的问题,但我无法找到一个我想要的解决方案。
解决方案
首先,.translatesAutoresizingMaskIntoConstraints
在真假之间切换是个坏主意。
您可能想要的是将您的文本视图的高度约束设置为 70... 将其连接到@IBOutlet
...,然后切换.isActive
该约束。
其次,如果你只有一行文本,那么内容大小高度可能是30,然后你调用
textViewIsExpanded = true
您的代码原样将设置textViewIsExpanded
为 true 但将保留为.isScrollEnabled
true ——因此它不会真正被“扩展”。
第三,您需要通过调用让自动布局知道您正在更改文本视图的大小调整行为:
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()
}
}
推荐阅读
- javascript - 如何使用 Lodash 将项目添加到数组的开头?
- php - 如何从一周中的某些日子限制 WooCommerce 运输区域
- reactjs - 如何让 bootstrap 和 antd 协同工作?
- java - 并发和多线程有什么区别?(尤其是在 Java 中)
- flutter - Flutter Wrap 小部件对齐:在 ExpansionPanel 内部
- vue.js - Nuxt 在初始化之前选择布局
- python - 使用 datetime 列循环遍历数据框
- git - 无法在我的本地仓库中创建分支
- mysql - mysql数据库中的唯一列
- isabelle - Isabelle/Simpl:使用 hoarestate 类型统一失败