ios - ScrollView 内的 TextView 粘在键盘上

标签 ios swift uiscrollview uitextview uikeyboard

我有一个 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)
}

关于ios - ScrollView 内的 TextView 粘在键盘上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29043517/

相关文章:

javascript - 如何检查应用程序是否从 Safari 中的 JS 安装?

ios - 是否可以使用谷歌地图将 webapp 功能嵌入到 map 中?

ios - 点击保存按钮时获取表格 View 单元格中的文本字段并存储在字典中?

ios - 如何根据标签或类似内容以特定顺序获取 UIScrollview 中 subview 的内容?

ios - 当用户打开应用程序时,如何使 iOS 应用程序返回到 initialVC?

ios - UITextView 从文本的底部或中间开始

xcode - 我想创建第二个按钮,但它没有出现 - Xcode 6 Swift

arrays - 保存包含类数据的表

ios - scrollview 在 iPhone 中不滚动

objective-c - 如何使 View Controller 可滚动?