因此,我的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以适应其内容。
答案 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自动处理键盘。