当你使用 UISearchController 在 UITableView 中实现搜索条,在搜索框已经激活并推入新的 VC 的时候会发生搜索框重叠的情况。
self.definesPresentationContext=YES; 就会解决
UISearchController 搜索框展开的过程其实就是 SearchBar 触发了一个 “presentViewController” 的动作,所以一切问题就出在了 present 的方式上。系统为我们提供了许多呈现样式,我们只需要设置要呈现的 VC 的 modalPresentationStyle 属性就能实现多种效果,通常我们使用到的是:
FullScreen: 顾名思义,它会在全屏范围内呈现一个视图控制器,效果其实在 iPad 或 iPhone 6/6s Plus 上体现的明显。
CurrentContext: 在当前上下文中显示一个视图控制器,如果你使用 iPad 或 iPhone 6/6s Plus,你可能见过 Master / Detail 的视图,其中左右两个视图分别都可以作为一个 Context,使用该模式,新的视图控制器就只会显示在制定的上下文中了。
OverCurrentContext: 与上面的区别是,这种方式会让父视图和正在呈现的视图控制器同时显示,通常我们要显示一个 HUD 的时候就需要这个模式,不然背景就会变成黑色。
Popover: 弹出气泡样式。
Custom: 自定义,通过 delegate 获取到 UIPresentationController 进而控制视图控制器的呈现效果。
这里,UISearchController 仅支持 OverCurrentContext、Popover 因此默认情况下使用的就是 OverCurrentContext 方式。
当一个视图控制器以 OverCurrentContext 的方式被呈现时,它会向上寻找一个 definesPresentationContext 属性为真的父视图控制器,并在它之上显示这个视图控制器。
因为我们没有指定任何视图控制器为 Presentation Context,那么 UISearchController 就会显示在最根部的 UINavigationController 之上,当然就会遮挡导航条了。但是当我们给 UINavigationController 中某一级的 VC 设置了 definesPresentationContext,UISearchController 就会显示在那个 VC 之上,而不会遮挡整个 UINavigationController。
思路来源: http://www.cocoachina.com/ios/20160805/17298.html