UIScrollView 的 contentInset 不起作用

Posted

技术标签:

【中文标题】UIScrollView 的 contentInset 不起作用【英文标题】:contentInset of the UIScrollView isn't working 【发布时间】:2014-08-05 09:25:42 【问题描述】:

我正在尝试在键盘出现时将内容向上移动。这是一个简单的登录表单的内容。

请注意,这些不是UITextFields。它只是UIViewController 中间的一个小UITableView。我有一个UIScrollView 填充嵌入该表视图的视图控制器。

我已经注册了键盘通知UIKeyboardDidShowNotificationUIKeyboardWillHideNotification

在键盘出现时触发的方法中,我实现了this 答案的变体,它的作用几乎相同,设置UIEdgeInsetsbottom 值,用于设置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:我之前看过那个帖子,但是那里的解决方案没有用,因为我的视图中没有任何UITextFields。 @holex 我实际上想自动向上移动滚动视图,而不是让用户向上滚动。我设法做到了这一点。我在这里发布了我的答案。

以上是关于UIScrollView 的 contentInset 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 内 UIScrollView 内 UIScrollView

UIScrollView里面的UIScrollView:滚动

UIScrollView 内的 UIScrollView 时滚动

UIScrollView 嵌入其他 UIScrollView

UIScrollView

分页 UIScrollView 内的 UIScrollView