当键盘打开时,Popover 中的 UITableView 滚动出界

Posted

技术标签:

【中文标题】当键盘打开时,Popover 中的 UITableView 滚动出界【英文标题】:UITableView in Popover scrolls out of bounds when keyboard is opened 【发布时间】:2010-06-25 23:14:46 【问题描述】:

我有一个包含 UITableView 的弹出框。这个 UITableView 有一个单元格,里面有一个文本字段:

alt text http://cl.ly/1b50a21ca8202d22db1b/content

当弹出框在屏幕底部附近打开时,我点击文本字段进行编辑,键盘会出现,弹出框会向上移动以避免被键盘覆盖。但是当它向上移动时,popover 中的 table view 会向上滚动出边界:

alt text http://cl.ly/4fe64fbfe9518f20560d/content

我可以将它向下滚动,但是如何防止这种情况发生。

【问题讨论】:

【参考方案1】:

我得出的结论是这是一个错误。我已经向 Apple (rdar://8156616) 和 report on OpenRadar 提交了错误报告。

对于任何感兴趣的人,here 是一个演示问题的示例项目。

【讨论】:

【参考方案2】:

尝试在表格视图上禁用滚动。

[self.tableView scrollingEnabled:NO];

【讨论】:

【参考方案3】:

您如何设置弹出式控制器的内容视图。请尝试编辑内容视图的自动调整大小掩码并从左上角设置。

希望这会有所帮助。

谢谢,

马杜普

【讨论】:

【参考方案4】:

或许你可以手动设置 UITableView 的 contentSize?这样它就不会向上滚动了。

【讨论】:

我也是这样做的,然后在滚动视图越界后我NSLogged内容大小,内容大小没有变化但问题仍然存在。 我可能会开始查看错误报告。我看不出你是怎么做错了什么或者可以做更多正确的事情,而且 UIPopoverController 在我使用它的过程中一直有很多错误。【参考方案5】:

我遇到了同样的问题,但是在隐藏键盘并重新加载表格视图时!

这个问题有一个解决方案!您需要做的是首先隐藏键盘并重新加载表格视图或在接收键盘隐藏通知的方法中更改表格视图!

一开始我打过电话

[textView resignFirstResponder]; or [textField resignFirstResponder];

然后

-(void)keyboardDidHide:(NSNotification *)notif 
   //Check some conditions if you want
   [tableView reloadData];

【讨论】:

【参考方案6】:

你需要听键盘才会显示通知:

NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardStatusForPopover(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)

然后你要看看键盘框架是否与popover相交,并减去从键盘添加到popover容器框架的值:

@objc func handleKeyboardStatusForPopover(_ notification: Notification) 
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue 
        if keyboardSize.intersects((self.resultPopOverTableViewController!.view.superview!.superview!.frame).insetBy(dx: 0, dy: 60)) 
            let popOverContainer = viewControllerDisplayedbyPopover?.view.superview!.superview!
            // cellDisplayingDetailInfo = sourceview of popover  
            popOverContainer!.frame.origin.y = popOverContainer!.frame.minY - keyboardSize.height + cellDisplayingDetailInfo.frame.maxY
        
    

【讨论】:

以上是关于当键盘打开时,Popover 中的 UITableView 滚动出界的主要内容,如果未能解决你的问题,请参考以下文章

移动网络 - 如何在键盘打开时获取屏幕高度

Android -- 打开时隐藏软键盘

用于在滚动视图中跟踪对象的 Popover 箭头

StatefulWidget 页面在键盘打开时重新创建

在adjustResize和软键盘打开时保留EditText比例

ionic (webApp)软qv键盘打开时视口高度变小导致样式问题的解决方案