UISearchController 与状态栏重叠并且不填充 iPhone X

Posted

技术标签:

【中文标题】UISearchController 与状态栏重叠并且不填充 iPhone X【英文标题】:UISearchController overlaps with status bar and doesn't fill iPhone X 【发布时间】:2017-10-13 12:34:58 【问题描述】:

我在 ios 11 中遇到了很多问题,并通过在导航栏上显示 UISearchController 来显示它(如 here 所述,Apple 教程中的示例)

@IBAction func searchAction(sender: UIBarButtonItem) 
    // Create the search controller and specify that it should present its results in this same view        
    searchController = UISearchController(searchResultsController: nil) 

    // Make this class the delegate and present the search
    self.searchController.searchBar.delegate = self
    presentViewController(searchController, animated: true, completion: nil)

它隐藏了应用程序的UINavigationBar,并在搜索栏显示UISearchController

问题 1. 在 iOS 11 上,它会导致搜索栏在第一次出现时与状态重叠(重试后不会重叠)。

UISearchController 首次亮相。状态栏和搜索栏之间没有空格。

UISearchController 再次出现,UINavigationBar 更大,搜索栏低于状态栏。

问题 2 在 iPhone X 上显示时它没有覆盖整个空间

我花了几个小时试图弄清楚。单击例如,是否有其他简单的方法可以在 iOS 11 上显示搜索栏。导航栏中的搜索图标?有没有办法修复 iPhone X 上的UISearchController 导航栏高度和空间?

【问题讨论】:

实际上,原生日历应用的搜索具有相同的行为。所以我不确定这是否是错误。但是,我也想解决您提到的问题 2。 您解决了吗?我看到了同样的问题。事实上,日历应用程序也出现了同样的问题。使用 iOS 11 UINavigationItem.searchController 不是一种选择,因为我不希望搜索栏在导航栏上永久存在。 有没有人解决上述问题?我也面临同样的问题。 【参考方案1】:

在 Apple 的“Building Apps for iPhone X”视频中,Apple 建议使用 UINavigationBar 的 searchController 属性,而不是手动显示搜索控制器。

这是它的工作原理:

if #available(iOS 11, *) 
   self.navigationItem.searchController = searchController;
   searchController.isActive = true;
 else 
   self.present(searchController, animated: true, completion: nil)

请注意,这仅在 iOS 11 中可用。对于早期版本,请执行您已经在执行的任何操作,因为它将继续工作。

如果您进行上述更改,您可能会遇到搜索控制器占据整个屏幕的问题。要解决此问题,您可以在显示 UISearchController 的主 UIViewController 上设置“definesPresentationContext”属性:

//set up UISearchController
self.definesPresentationContext = true;

如果您最终将 definePresentationContext 属性设置为 true,请确保检查它不会干扰您的 VC 呈现的任何其他 UIViewController。

【讨论】:

如果我这样做,搜索栏将永久位于我的导航栏上(滚动期间除外),这是我不想要的。像您建议的那样在按钮按下时分配控制器看起来不错,但解雇navigationItem.searchController = nil 看起来很糟糕。有什么想法吗?

以上是关于UISearchController 与状态栏重叠并且不填充 iPhone X的主要内容,如果未能解决你的问题,请参考以下文章

UISearchController 搜索栏与 CollectionView 重叠

UISearchController 的搜索栏与第一个 tableview 单元格重叠

UISearchBar 在活动时与 UITableView 内容重叠

搜索控制器中的搜索栏重叠状态栏

UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠

使用 UISearchController 时,iOS 13 UIBarButtonItem 不可点击和重叠 UINavigationBars