2017-03-04 44 views
1

所以我的iOS应用程序有一个UIScrollview设置在故事板上使用自动布局的顶部,底部,领先和尾随约束绑定到超级视图。在scrollview里面我有stackview和多个垂直堆叠的UITextviews。 scrollview的内容设置很好,我甚至可以上下滚动。UITextview键盘处理,当它嵌入在UIScrollView

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

有问题如下所示仅作参考,但它非常简单,只是苹果的例子的复制粘贴的特定代码:

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)被调用,但不会发生滚动。

我研究了一下,发现,苹果不建议嵌入的UITextView一个UIScrollView内:Placing a text view inside of a scroll view

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

但是,我真的需要这个“自动”滚动到隐藏文本视图,以使用与UITextFields相同的方式。有什么建议么??

PS:我应该提到,我不介意禁用UITextViews中的滚动操作,因为我已经使用自动布局自动调整UITextViews以适合其内容。

回答

1

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

试试这段代码笔记本测试过)...

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

我推荐你使用下面的scrollview自动处理键盘。

https://github.com/michaeltyson/TPKeyboardAvoiding

+0

看起来像一个很好的图书馆,虽然它会是我的用例矫枉过正。也许是为了更大的项目。但对于我的用例KevinM的答案效果很好。 –