iOS横屏模式下UISearchController布局错乱问题求助(Xcode10.2)
解决横屏模式下UISearchController UI错乱问题
结合你不用系统内置导航栏的场景,你遇到的横屏UI错乱问题,核心原因是UISearchBar的约束不完整以及横屏时缺少布局适配逻辑,我给你几个针对性的解决方案:
1. 给SearchBar添加完整的Auto Layout约束
你当前只是把searchBar添加到vwSearch上,但没有设置任何约束,这会导致横屏时searchBar无法跟随vwSearch的尺寸变化正确布局。修改你的setupSerachResultController方法,添加约束让searchBar完全填充vwSearch:
func setupSerachResultController() { searchController.searchResultsUpdater = self searchController.obscuresBackgroundDuringPresentation = true searchController.searchBar.placeholder = "Search Email" searchController.searchBar.searchBarStyle = .minimal searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.scopeBarBackgroundImage = UIImage.imageWithColor(color: UIColor.clear) searchController.searchBar.tintColor = UIColor.white // 关键:禁用自动布局转换,添加约束 searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false vwSearch.addSubview(searchController.searchBar) // 绑定四个边缘的约束,让searchBar完全填充vwSearch NSLayoutConstraint.activate([ searchController.searchBar.topAnchor.constraint(equalTo: vwSearch.topAnchor), searchController.searchBar.leadingAnchor.constraint(equalTo: vwSearch.leadingAnchor), searchController.searchBar.trailingAnchor.constraint(equalTo: vwSearch.trailingAnchor), searchController.searchBar.bottomAnchor.constraint(equalTo: vwSearch.bottomAnchor) ]) searchController.searchBar.scopeButtonTitles = ["One","Two","Three","Four"] searchController.searchBar.delegate = self // 重要:因为不用系统导航栏,禁用自动隐藏导航栏的行为,避免干扰布局 searchController.hidesNavigationBarDuringPresentation = false }
2. 横屏时动态调整高度适配
横屏时屏幕宽度变窄,scopeBar的按钮可能出现挤压或换行,你可以在屏幕旋转时动态调整vwSearch的高度,确保scopeBar完整显示:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) coordinator.animate(alongsideTransition: { context in let isLandscape = size.width > size.height // 根据是否处于编辑状态+横竖屏调整高度 if self.searchController.searchBar.isFirstResponder { self.vwSearchHeightConstant.constant = isLandscape ? 120 : 100 } else { self.vwSearchHeightConstant.constant = 60 } self.view.layoutIfNeeded() }) }
3. 强制更新SearchBar布局避免错乱
在进入/退出编辑状态的动画中,强制让searchBar更新内部布局,避免scopeBar出现排版问题:
extension ListViewController: UISearchBarDelegate,UISearchResultsUpdating { func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { } func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { UIView.animate(withDuration: 0.3) { self.vwSearchHeightConstant.constant = 100 self.view.layoutIfNeeded() } // 强制更新searchBar内部布局,避免scopeBar排版错乱 searchBar.layoutIfNeeded() return true } func updateSearchResults(for searchController: UISearchController) { let searchBar = searchController.searchBar let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { UIView.animate(withDuration: 0.3) { self.vwSearchHeightConstant.constant = 60 self.view.layoutIfNeeded() } // 退出编辑时也更新一下布局 searchBar.layoutIfNeeded() } }
为什么这些方法能解决问题?
- 完整的约束确保searchBar始终和vwSearch的边界对齐,不会出现偏移或尺寸不匹配;
- 横屏时的动态高度调整适配了scopeBar在窄屏幕下的显示需求;
- 强制布局更新避免了UISearchBar内部元素在动画过程中出现排版错乱。
内容的提问来源于stack exchange,提问作者Pratik Sodha
相关产品推荐
相关产品推荐

