ios - 自动滚动到放置在 UITableViewCell 内的 textView 光标在 iOS11 中不起作用

标签 ios iphone swift

我在编辑时根据 cell 内的 UITextView 光标位置具有 tableView 的自动滚动功能。

它适用于以前的 iOS 版本。从 iOS11 开始它就坏了。

我已经根据键盘高度设置了 tableView contentInset。对于自动滚动,我在 textViewDidChange

中使用以下代码
if let confirmedTextViewCursorPosition = textView.selectedTextRange?.end {

            let caretPosition = textView.caretRect(for: confirmedTextViewCursorPosition)
            var textViewActualPosition = tableView.convert(caretPosition, from: textView.superview?.superview)
            textViewActualPosition.origin.y += 22.0 
            tableView.scrollRectToVisible(textViewActualPosition, animated: false)

        }

最佳答案

Askh1t是正确的,这是我的实现:

    var info = notification.userInfo!
    var keyboardSize:CGRect = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    if keyboardSize.size.height <= 0 { // to fix bug on iOS 11
        keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    }

以及适合您的完整模块化实现:

//MARK: - Properties
var activeTextView: UITextView?

//MARK: - Scroll View Notifications
// add in viewDidLoad
func registerForKeyboardNotifications(){
    //Adding notifies on keyboard appearing
    NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillShow, object: nil, queue: nil, using: keyboardWasShown)
    NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillHide, object: nil, queue: nil, using: keyboardWillBeHidden)
}

//add in viewWillDisappear
func deregisterFromKeyboardNotifications(){
    //Removing notifies on keyboard appearing
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWasShown(notification: Notification) -> Void {
    //Need to calculate keyboard exact size due to Apple suggestions
    self.tableView.isScrollEnabled = true
    var info = notification.userInfo!
    var keyboardSize:CGRect = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    if keyboardSize.size.height <= 0 { // to fix bug on iOS 11
        keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    }
    self.tableView.contentInset.bottom = keyboardSize.height //add this much
    self.tableView.scrollIndicatorInsets.bottom = keyboardSize.height //scroll too it.

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize.height
    if let activeField = self.activeTextView {
        if (!aRect.contains(activeField.frame.origin)){
            self.tableView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}

func keyboardWillBeHidden(notification: Notification){
    self.tableView.contentInset.bottom = 0
    self.tableView.isScrollEnabled = true
    self.tableView.alwaysBounceVertical = true
}

func textViewDidBeginEditing(_ textView: UITextView){
    activeTextView = textView

}


func textViewDidEndEditing(_ textView: UITextView){
    tableView.isScrollEnabled = true
    activeTextView = nil
}

关于ios - 自动滚动到放置在 UITableViewCell 内的 textView 光标在 iOS11 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47708491/

相关文章:

ios - 如何从 Crittercism 诊断 iOS 崩溃报告(SIGSEGV)

ios - 在 Swift 中设置呈现模态的自定义大小失败——占用全屏

iphone - 已退款的应用内购买订阅是否显示为已过期?

IOS无法读取iphone5或4s上的二维码,但6、6s可以

ios - 使用 Sprite Kit 将尺寸从 4 英寸调整为 3.5

ios - 无法播放AVAudioPlayer中文档中的文件

ios - 如何在 Objective c 中动态设置 UILabel 高度?

ios - 在 iOS 中使用 AVFoundation 进行音频混合不起作用

ios - 如何使用 Swift 获取 youtube channel 的所有播放列表?

ios - 快速调用中的额外参数