为啥显示键盘时 UIScrollView 不滚动?

Posted

技术标签:

【中文标题】为啥显示键盘时 UIScrollView 不滚动?【英文标题】:Why UIScrollView doesn't scroll when keyboard is shown?为什么显示键盘时 UIScrollView 不滚动? 【发布时间】:2015-04-10 14:32:53 【问题描述】:

我的 UIScrollView 中有一个 UITextField。这是显示键盘时滚动视图以使 UITextField 保持可见的代码:

func keyboardWasShown(aNotification:NSNotification) 

    let info: NSDictionary = aNotification.userInfo!
    let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue
    let keyboardSize: CGSize = value.CGRectValue().size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0)

    theScrollView.contentInset = contentInsets
    theScrollView.scrollIndicatorInsets = contentInsets

    var aRect: CGRect = self.view.frame
    aRect.size.height -= keyboardSize.height
    let activeTextFieldRect: CGRect? = nicknameLabel?.frame
    let activeTextFieldOrigin: CGPoint? = activeTextFieldRect?.origin

    if (!CGRectContainsPoint(aRect, activeTextFieldOrigin!)) 
        theScrollView.scrollRectToVisible(activeTextFieldRect!, animated:true)
    

我做错了什么?

【问题讨论】:

【参考方案1】:

当我在带有 AutoLayout 的情节提要中有一个滚动视图时遇到了这个问题,问题是带有 AutoLayout 的 UIScrollView 不知道它的内容大小,即使你以编程方式设置它的内容大小,它的内容大小是从应用的约束中推断出来的到它的内容视图,如果滚动视图内容中有很多子视图,它可能会很混乱,所以我通过将滚动视图中的所有子视图添加到根视图并将这个根视图添加为我的滚动视图的内容来解决问题,当然还有这个根视图的 top , left , bottom , right , width 和 height 到滚动视图,这样滚动视图就可以准确地知道它的内容视图的大小,这是苹果发布的关于这个问题的技术说明https://developer.apple.com/library/ios/technotes/tn2154/_index.html

希望这会有所帮助!

【讨论】:

【参考方案2】:

我在 m.eldehairy 回答之后找到了解决方案。

// I add all my subviews in a contentView with a predefined HEIGHT and WIDTH
let contentView = UIView(frame: CGRect(x: 0, y: 0, width: WIDTH, height: HEIGHT))
contentView.addSubview(view1)
contentView.addSubview(view2)
    ...

// I embed my contentView in the scrollView, and set its content size
myScrollView.addSubview(contentView)
myScrollView.contentSize = CGSizeMake(WIDTH, HEIGHT)

有效。

【讨论】:

以上是关于为啥显示键盘时 UIScrollView 不滚动?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 仅在显示键盘时才需要

显示键盘时如何决定滚动哪个 UIScrollView

当键盘可见时,UIScrollView滚动到按钮

键盘出现时的UIScrollView

当我在显示的键盘上单击文本字段两次时,iOS UIScrollView 无法滚动

UIScrollView 在键盘关闭时停止滚动