iOS 11中UITableView添加RefreshControl与SearchController显示异常问题
解决UITableView自定义RefreshControl和SearchController的显示问题
嘿,我来帮你搞定这两个头疼的UI问题~
一、自定义RefreshControl代码触发不显示在顶部的问题
你之前用tableView.addSubview(customRefreshControl)的方式添加下拉刷新控件,这是iOS 10之前的旧写法,系统不会自动帮你管理它的位置和滚动关联,所以代码触发动画时控件会藏在顶部看不到。
解决方法很简单,换成系统提供的专属属性来设置:
// 替换 tableView.addSubview(customRefreshControl) 这行 tableView.refreshControl = customRefreshControl
另外,当你需要代码主动触发刷新动画时,光调用customRefreshControl.beginRefreshing()还不够,得手动让tableView滚动到能显示控件的位置,加上这行:
customRefreshControl.beginRefreshing() // 调整contentOffset让RefreshControl显示出来 tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - customRefreshControl.frame.height), animated: true)
这样系统就会自动处理导航栏、tableView边缘的布局适配,触发后控件会直接显示在顶部啦。
二、添加SearchController后的显示异常问题
你之前的SearchController配置可能没跟上iOS 11+的规范,导致和导航栏、RefreshControl出现布局冲突。调整一下配置方式:
override func viewDidLoad() { super.viewDidLoad() navigationItem.largeTitleDisplayMode = .automatic // 重新配置SearchController let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.tintColor = .white searchController.searchBar.delegate = self // 可选:如果不想搜索时背景变暗,打开这个 searchController.obscuresBackgroundDuringPresentation = false // 用navigationItem的专属属性设置,而不是手动添加 navigationItem.searchController = searchController // 确保搜索栏只在当前页面显示,避免push后残留 definesPresentationContext = true // 正确设置RefreshControl tableView.refreshControl = customRefreshControl title = "location_groups".localized }
关键的几个点:
- 用
navigationItem.searchController替代手动添加搜索栏,系统会自动处理它和大标题、tableView的布局联动 - 加上
definesPresentationContext = true,可以避免搜索栏在跳转到其他页面后仍然显示的异常 - 如果遇到搜索栏被导航栏遮挡的情况,可以检查一下
navigationItem.hidesSearchBarWhenScrolling的设置,根据需求设为true或false
这样调整后,RefreshControl和SearchController的显示应该都正常啦~
内容的提问来源于stack exchange,提问作者mike bob
相关产品推荐
相关产品推荐

