ScrollView 中的 TextView 粘在键盘上

TextView inside ScrollView stick to keyboard

我有一个 UIScrollView 和里面的内容。内容里面有一个UITextView。当用户按下 UITextView 我想要 UITextView 粘在键盘上。


图中:
整个事情是 UIScrollView
底部黑色区域为可视屏幕
红色区域为内容
蓝色区域为UITextView
绿色距离是内容和屏幕边界之间的动态边距。

我想计算用户可以看到的绿色距离以及用户可以看到的蓝色区域(UITextView)。如果用户滑动一半 UITextViewUITextView 应该仍然粘在键盘上。

    let userInfo = notification.userInfo!

    let keyboardEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
    let keyboardBeginFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue()
    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as UInt
    let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as Double

    let options = UIViewAnimationOptions(curve << 16)
    UIView.animateWithDuration(duration, delay: 0, options: options,
        animations: {

            var visibleGreen = ???
            var visibleBlue = ???
            var amountToSubtract = visibleGreen + visibleBlue


            var newFrame = (self.currentCardInstance?.newCommentCell.frame)!
            var kbFrameEnd = self.view.convertRect(keyboardEndFrame, toView: nil)
            var kbFrameBegin = self.view.convertRect(keyboardBeginFrame, toView: nil)
            newFrame.origin.y -= kbFrameBegin.origin.y - kbFrameEnd.origin.y + amountToSubtract

            self.currentCardInstance?.newCommentCell.frame = newFrame;
        },
        completion: nil
    )

我是这样解决的:

var keyboardModifier: CGFloat = 0

func keyboardWillAppear(notification: NSNotification) {
    println("keyboardWillAppear")
    keyboardResize(notification: notification)
    scrollToBottom()
}

func keyboardWillDisappear(notification: NSNotification) {
    println("keyboardWillDisappear")
    keyboardResize(notification: notification)
}

func keyboardResize(#notification: NSNotification) {
    let userInfo = notification.userInfo!
    let keyboardEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
    let keyboardBeginFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as NSValue).CGRectValue()
    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as UInt
    let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as Double
    let options = UIViewAnimationOptions(curve << 16)

    var newFrame = (self. currentCardInstance?.frame)!
    var kbFrameEnd = self.view.convertRect(keyboardEndFrame, toView: nil)
    var kbFrameBegin = self.view.convertRect(keyboardBeginFrame, toView: nil)

    keyboardModifier = kbFrameBegin.origin.y - kbFrameEnd.origin.y

    scrollView.frame.size.height -= keyboardModifier
}

func scrollToBottom() {
    var bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
    scrollView.setContentOffset(bottomOffset, animated: false)
}