UIScrollView 的 contentInset 不起作用
Posted
技术标签:
【中文标题】UIScrollView 的 contentInset 不起作用【英文标题】:contentInset of the UIScrollView isn't working 【发布时间】:2014-08-05 09:25:42 【问题描述】:我正在尝试在键盘出现时将内容向上移动。这是一个简单的登录表单的内容。
请注意,这些不是UITextField
s。它只是UIViewController
中间的一个小UITableView
。我有一个UIScrollView
填充嵌入该表视图的视图控制器。
我已经注册了键盘通知UIKeyboardDidShowNotification
和UIKeyboardWillHideNotification
。
在键盘出现时触发的方法中,我实现了this 答案的变体,它的作用几乎相同,设置UIEdgeInsets
的bottom
值,用于设置contentInset
的滚动视图。
func keyboardWasShown(notification: NSNotification)
var info: NSDictionary = notification.userInfo as NSDictionary
var keyboardSize: CGSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size
let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
问题是它什么也没做。我成功获得了键盘的高度,但没有任何变化。谁能告诉我为什么以及我应该怎么做才能解决这个问题?
谢谢。
【问题讨论】:
检查这个答案,它适用于 ObjC,但逻辑是一样的:***.com/questions/23988866/… 【参考方案1】:UIEdgeInsets UIEdgeInsetsMake (
CGFloat top,
CGFloat left,
CGFloat bottom,
CGFloat right
);
您正在设置底部。尝试设置顶部插图。也许负值会有所帮助。
【讨论】:
将负值设置为顶部起始有效,但我不想硬编码值。这就是为什么我一直在寻找一种更清洁的方法。我设法通过使用不同的方法来做到这一点。我在这里发布了我的答案。【参考方案2】:经过一番努力,我能够完成我想要的。我所做的是,在viewDidLoad
我注册了键盘通知。当键盘出现时,我将它的框架放入一个变量中,并将登录表单(这是一个表格视图)的框架放入另一个变量中。
通过使用CGRectIntersection
,当键盘与登录表单重叠并达到其高度时,我得到了相交部分的框架。然后我只需在滚动视图的setContentOffset
方法中设置它以自动向上移动滚动视图。要将其移回原始位置,我只需将滚动视图的contentOffset
属性再次设置为CGPointZero
。
func registerForKeyboardNotifications()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
func keyboardWasShown(notification: NSNotification)
var info: NSDictionary = notification.userInfo as NSDictionary
var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
var loginFormFrame: CGRect = self.view.convertRect(self.tableView.frame, fromView: nil)
var coveredFrame: CGRect = CGRectIntersection(loginFormFrame, keyboardFrame)
self.scrollView.setContentOffset(CGPointMake(0, coveredFrame.height + 20), animated: true)
func keyboardWillBeHidden(notification: NSNotification)
self.scrollView.contentOffset = CGPointZero
【讨论】:
【参考方案3】:ContentInset
表示内容视图与封闭滚动视图之间的距离。您需要做的是更改 origin.y 值。
见How to make a UITextField move up when keyboard is present?
【讨论】:
contentInset
专门设计用于处理屏幕上出现的键盘,而无需更改 UIScrollView
实例的 frame
- 所以与 frame
根本没有任何关系,你应该已经链接了这个:***.com/questions/23988866/…
@Allen:我之前看过那个帖子,但是那里的解决方案没有用,因为我的视图中没有任何UITextField
s。
@holex 我实际上想自动向上移动滚动视图,而不是让用户向上滚动。我设法做到了这一点。我在这里发布了我的答案。以上是关于UIScrollView 的 contentInset 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 内 UIScrollView 内 UIScrollView
UIScrollView里面的UIScrollView:滚动
UIScrollView 内的 UIScrollView 时滚动