iOS 11中SearchBar上方出现额外空间的技术问题求助
解决iOS 11+中SearchBar上方出现额外空间的问题
这个问题我之前做项目时也碰到过,本质是iOS 11新引入的UINavigationItem.searchController属性,在初始布局阶段和导航栏的布局逻辑没完全同步导致的偏移,尤其是当你混合了新旧版本的搜索栏配置方式时,更容易出现这种情况。下面是几个经过验证的可行解决方法:
方法1:修改搜索控制器的导航栏隐藏配置
默认情况下UISearchController的hidesNavigationBarDuringPresentation属性是YES,这会导致初始状态下导航栏和搜索栏之间出现莫名的间距。你可以在初始化搜索控制器的时候加上这行代码:
searchNavigation.searchController.hidesNavigationBarDuringPresentation = NO;
再把它赋值给navigationItem.searchController,基本能解决输入前的额外空间问题。
方法2:强制导航栏立即更新布局
有时候布局系统没能及时响应你的配置变更,你可以在设置完所有导航栏属性后,强制触发一次布局刷新:
if (@available(iOS 11.0, *)) { self.navigationItem.searchController = searchNavigation.searchController; self.navigationController.navigationBar.prefersLargeTitles = NO; self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; // 强制导航栏应用新布局 [self.navigationController.navigationBar layoutIfNeeded]; } else { self.navigationItem.titleView = searchNavigation.searchController.searchBar; }
这行layoutIfNeeded会让导航栏立刻应用新的配置参数,消除初始的布局偏移。
方法3:设置正确的展示上下文
在你的ViewController的viewDidLoad方法里添加self.definesPresentationContext = YES;,告诉系统当前控制器负责管理搜索控制器的展示上下文,避免跨控制器的布局冲突:
- (void)viewDidLoad { [super viewDidLoad]; self.definesPresentationContext = YES; // 其他初始化代码... }
建议先尝试方法1,这是最常见的解决方案,大部分场景下都能搞定问题。如果不行的话,再结合方法2和3一起试试。
内容的提问来源于stack exchange,提问作者Alişan Dağdelen
相关产品推荐
相关产品推荐

