在编辑键盘时保持键盘上方的文本视图



我有一个动态高度的文本视图。当用户添加或删除文本时,文本视图的高度会发生变化。

我的问题是,随着用户添加文本并且文本视图的增长,它会消失在键盘后面。当键盘出现时,我已经成功地移动了视图,以便从一开始就隐藏文本视图,但我似乎无法弄清楚如何在高度变化时将其保持在键盘上方。任何帮助都非常感谢!

键盘出现和消失时移动视图的功能:

func keyboardWillShow(sender: NSNotification) {
    let info: NSDictionary = sender.userInfo!
    let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue
    let keyboardSize: CGSize = value.CGRectValue().size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 20, 0.0)
    scrollView.contentInset = contentInsets
    var aRect: CGRect = self.view.frame
    aRect.size.height -= keyboardSize.height
    let activeTextFieldRect: CGRect? = activeItemRect()
    let activeTextFieldCentre: CGPoint? = CGPointMake(CGRectGetMidX(activeTextFieldRect!), CGRectGetMidY(activeTextFieldRect!))
    if (!CGRectContainsPoint(aRect, activeTextFieldCentre!)) {
        scrollView.scrollRectToVisible(activeTextFieldRect!, animated:true)
    }
}
func keyboardWillHide(sender: NSNotification) {
    let contentInsets: UIEdgeInsets = UIEdgeInsetsZero
    scrollView.contentInset = contentInsets
}

因此,需要发生的是,每当光标的位置发生变化时,如果它超出边界,就需要告诉包含的scrollView进行滚动。我已经从链接改编了一个函数来调用来执行此操作。确保将scrollView替换为您的名称。

internal func scrollToCursorForTextView(textView: UITextView) {
    var cursorRect = textView.caretRectForPosition(textView.selectedTextRange!.start)
    cursorRect = scrollView.convertRect(cursorRect, fromView: textView)
    if !self.rectVisible(cursorRect) {
      cursorRect.size.height += 8
      scrollView.scrollRectToVisible(cursorRect, animated: true)
    }
}
internal func rectVisible(rect: CGRect) -> Bool {
    var visibleRect = CGRect()
    visibleRect.origin = scrollView.contentOffset
    visibleRect.origin.y += scrollView.contentInset.top
    visibleRect.size = scrollView.bounds.size
    visibleRect.size.height -= scrollView.contentInset.top + scrollView.contentInset.bottom
    return CGRectContainsRect(visibleRect, rect)
}

迅捷 4 更新

internal func scrollToCursorForTextView(textView: UITextView) {
    guard let startOfRange = textView.selectedTextRange?.start else { return }
    var cursorRect = textView.caretRect(for: startOfRange)
    cursorRect = scrollView.convert(cursorRect, from: textView)
    if !rectVisible(rect: cursorRect) {
        cursorRect.size.height += 8
        scrollView.scrollRectToVisible(cursorRect, animated: true)
    }
}
func rectVisible(rect: CGRect) -> Bool {
    var visibleRect = CGRect()
    visibleRect.origin = scrollView.contentOffset
    visibleRect.origin.y += scrollView.contentInset.top
    visibleRect.size = scrollView.bounds.size
    visibleRect.size.height -= scrollView.contentInset.top + scrollView.contentInset.bottom
    return visibleRect.contains(rect)
}

最新更新