为啥显示键盘时 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 不滚动?的主要内容,如果未能解决你的问题,请参考以下文章