UITextview嵌入UIScrollView

时间:2017-03-04 22:07:59

标签: ios iphone uiscrollview uitextview

因此,我的iOS应用程序在故事板中设置了UIScrollview,使用autolayout,其中top,bottom,leading和trailing约束绑定到superview。在scrollview内部,我有一个stackview,垂直堆叠多个UITextviews。 scrollview的contentsize设置正常,我甚至可以上下滚动。

现在,我的问题出现在键盘处理上。我使用苹果公司文档中推荐的键盘方式处理键盘: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不建议在Uiscrollview中嵌入UITextView:Placing a text view inside of a scroll view

  

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

然而,我真的需要这个"自动"滚动到隐藏的textview以与UITextFields相同的方式工作。有什么建议??

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我建议您使用以下scrollview自动处理键盘。

https://github.com/michaeltyson/TPKeyboardAvoiding