【发布时间】:2017-07-14 10:43:11
【问题描述】:
我已经搜索过这个问题并找到了一些零碎的东西,但不是真正的重复。
我正在尝试创建一个 UITextView,它封装在一个 UIView 中,它会根据其内容动态改变它的高度,这很容易通过自动布局和禁用 UITextView 上的滚动来解决。
然后,我希望 UITextView 使用可能会或可能不会关闭的键盘以交互方式移动(通过在 UIScrollView 上设置以交互方式关闭的属性)。
这种整体行为将模仿文本输入在 iOS 消息上的工作方式——它几乎可以通过交互式关闭键盘很好地滚动,并在需要时增加高度。
到目前为止,我的尝试是创建一个占据整个视图的 UITableView,以及另一个封装文本视图的视图,它被水平约束并固定在视图控制器视图的底部。高度被省略,但自动布局可以通过其中的 UITextView 确定大小。
如图:
到目前为止,这在模拟器中运行良好,无需产生键盘:
现在,为了将封装视图固定到键盘上,我尝试将其用作视图控制器上的输入附件视图,为此,我必须首先将其从视图中删除控制器的视图层次结构。我不确定在哪里执行此操作(键盘将显示通知,文本视图应该开始编辑委托等?)因为到目前为止我所做的一切都导致视图作为键盘的附件视图丢失(如果键盘确实显示)。
像这样:
发件人:
import UIKit
class ViewController: UIViewController {
// MARK: - Outlets
@IBOutlet weak var inputTextview: UITextView!
@IBOutlet weak var genericInputContainer: UIView!
// MARK: - Properites
fileprivate var shouldAddInputContainerAsAccessory = false
override var inputAccessoryView: UIView? {
if shouldAddInputContainerAsAccessory {
return genericInputContainer
}
return nil
}
// MARK: - Actions
@objc fileprivate func keyboardWillShow(sender: Notification) {
}
fileprivate func observeNotifications() {
let keyboardWillShowAction = #selector(keyboardWillShow(sender:))
NotificationCenter.default.addObserver(
self,
selector: keyboardWillShowAction,
name: Notification.Name.UIKeyboardWillShow,
object: nil)
}
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
observeNotifications()
inputTextview.delegate = self
}
}
extension ViewController: UITextViewDelegate {
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
genericInputContainer.removeFromSuperview()
shouldAddInputContainerAsAccessory = true
return true
}
func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
shouldAddInputContainerAsAccessory = false
return true
}
}
我对尝试从已经存在的视图创建新视图犹豫不决,因为我将向封装视图(文本视图旁边)内的元素添加几个不同的动画/变换。
【问题讨论】:
-
我会将带有文本字段的视图设为视图控制器视图的
inputAccessoryView,然后将视图控制器的视图设为viewDidAppear中的第一响应者。您必须将UIView子类化以从canBecomeFirstResponder返回true,然后将视图控制器的根视图的类设置为情节提要中的子类。如果您这样做,则根本不会添加带有添加到视图层次结构中的文本字段的视图,因为当视图成为第一响应者时系统会自行添加它。 -
@Fred 你最终找到解决方案了吗?我在同一条船上。
标签: ios swift uiscrollview uitextview