【问题标题】:UITextview Keyboard handling when it is embedded in UIScrollView嵌入 UIScrollView 时的 UITextview 键盘处理
【发布时间】:2017-07-24 22:14:25
【问题描述】:

所以我的 iOS 应用程序在故事板中设置了一个 UIScrollview,它使用自动布局将顶部、底部、前导和尾随约束绑定到超级视图。在滚动视图内部,我有多个 UITextview 垂直堆叠的 stackview。滚动视图的内容大小设置得很好,我什至可以上下滚动。

现在,我的问题与键盘处理有关。我处理键盘的方式与苹果文档中推荐的相同:Apple's Keyboard handling documentation

下面显示的特定代码仅供参考,但它几乎只是 Apple 示例的复制粘贴:

 func keyboardDidShow(notification: NSNotification){
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if self.activeTextView != nil {
        if (!aRect.contains(self.activeTextView!.bounds)){
            self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true)
        }
    }
}

我的键盘处理代码适用于 UITextFields,但不适用于 UITextFields。 self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true) 被调用但没有滚动发生。

我研究了一下,发现 Apple 不建议将 UITextView 嵌入到 uiscrollview 中:Placing a text view inside of a scroll view

在滚动视图中放置一个文本视图。文本视图处理它们自己的滚动。您不应该在滚动视图中嵌入文本视图对象。如果这样做,可能会导致意外行为,因为这两个对象的触摸事件可能会混淆和错误处理。

但是,我真的需要这种“自动”滚动到隐藏的 textview 以与 UITextFields 一样工作。有什么建议吗??

PS:我应该提一下,我不介意在 UITextViews 中禁用滚动,因为我已经使用自动布局自动调整 UITextViews 以适应其内容大小。

【问题讨论】:

    标签: ios iphone uiscrollview uitextview


    【解决方案1】:

    我建议你使用下面的滚动视图来自动处理键盘。

    https://github.com/michaeltyson/TPKeyboardAvoiding

    【讨论】:

    • 似乎是一个不错的库,尽管它对我的用例来说有点矫枉过正。也许对于一个更大的项目。但对于我的用例,KevinM 的回答效果很好。
    【解决方案2】:

    我想说虽然不建议在 UIScrollView 中嵌入 UITextView,但这不应该阻止滚动视图滚动到特定的帧。您能否检查您尝试滚动到的框架(self.activeTextView.frame)是否“正确”?部分意外的 UITextView-inside-scrollview 行为可能是 textview 的框架不是预期的。抱歉,我正在路上,我将无法尝试重现您的问题并提供更具体的解决方案,但请检查框架,如果不是您所期望的(给定 UITextView 在窗口中的位置),那么也许尝试转换 rect从它的父视图到你的主视图 - 如果这是问题,那么解决方法是将你的 UITextView 嵌入 UIView 并在键盘出现时滚动到 UIView 的框架..

    试试这段代码(虽然我已经测试过了)...

      self.scrollView.scrollRectToVisible(self.activeTextView!.superview!.frame, animated: true)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多