带有UITerollView的UITextView随UIScrollView移动而解除交互式

时间:2017-02-23 19:23:18

标签: ios swift uiscrollview uitextview

我已经搜索过这个问题并找到了比特&碎片但不是真正的重复。

我正在尝试创建一个UITextView,它封装在一个UIView中,它会根据它的内容动态地改变它的高度,这可以通过自动布局和禁用UITextView上的滚动来轻松解决。

然后我想让UITextView以交互方式移动,使用可能会或可能不会解散的键盘(通过在UIScrollView上设置dismiss interactively属性)。

这种整体行为将模仿文本输入在iOS消息上的工作方式 - 它几乎可以与交互式解雇键盘滚动,并在需要时增加高度。

到目前为止,我的尝试是创建一个占用整个视图的UITableView,以及另一个封装文本视图的视图,它被水平约束并固定在视图控制器视图的底部。高度被省略,但自动布局可以通过其中的UITextView内在地确定大小。

如图所示:

enter image description here

这在目前为止在模拟器中如此好用而没有产生键盘:

enter image description here

现在,为了将封装视图固定到键盘上,我试图将它用作视图控制器上的输入附件视图,为了做到这一点,我必须先将其从视图中删除控制器的视图层次结构。我不确定到底要做什么(键盘会显示通知,文本视图应该开始编辑委托等等?)因为到目前为止我所尝试的所有内容都导致视图丢失作为键盘的附件视图(如果键盘确实显示)。

像这样:

enter image description here

自:

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
    }
}

我对尝试从已存在的视图创建新视图犹豫不决,因为我将在封装视图(文本视图旁边)中向元素添加几个不同的动画/变换。

1 个答案:

答案 0 :(得分:0)

不是删除输入然后将其分配给键盘附件,而是使用键盘观察器获取键盘出现时的高度,然后调整文本输入的底部约束。您可以像这样获得键盘高度:

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        self.keyboardHeight = keyboardSize.height
        //debugPrint(keyboardHeight)
    }
}