Closed MoLice closed 4 years ago
断点观察到在滚动列表时,UISearchController
内部确实有一套机制去根据 UIScrollView
的滚动动作调整 UISearchBar
内部的 maskView
布局,从而保证即便 navigationBar 背景透明,searchBar 也不会透出到 navigationBar 背后。目前暂时通过 swizzle - [UISearchBar _setMaskBounds:]
来优化这种调整,不管有没有 shadowImage,maskView 都没必要留出顶部的 1px 间隙,下个版本会给出对应的接口。
Bug 表现 searchControl导致navBar的关联性问题
iOS 11及以上系统,滑动UITableView
会出现LargeTitle
动画效果
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
[self.view addSubview:self.tableView];
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
} else {
// Fallback on earlier versions
// 设置为HeaderView则不会出现此问题
self.tableView.tableHeaderView = self.searchController.searchBar;
}
截图
第一次进来
滑动后的效果
触发UINavigationController(LargeTitleCompatibility)
的swizzle
方法
Bug 表现 searchControl导致navBar的关联性问题
iOS 11及以上系统,滑动
UITableView
会出现LargeTitle
动画效果
你是指 navigationBar 变透明了吗,这个是 iOS 11 设置了 navigationItem.searchController 后的系统默认特性,和 QMUI 无关,如果你不需要这个特性请写上
self.navigationItem.hidesSearchBarWhenScrolling = NO;
如何重现
UIImage.new
)作为UINavigationBar.shadowImage
,避免导航栏分隔线挡住 searchBar 导致无法观察到 bug 现象。UITableViewController
界面,初始化一个UISearchController
并将它的searchBar
属性赋值给tableView.tableHeaderView
。为了便于观察,可将tableView.backgroundColor
设置为显眼的颜色。searchBar
和navigationBar
是贴合在一起的。searchBar
重新布局,当列表停止滚动后可以看到searchBar
顶部出现一个 1px 的间隙。截图
测试 Demo TestSearchBar.zip
注意 如果直接初始化一个
UISearchBar
并赋值给tableHeaderView
,则不会出现该问题。其他信息