集成Google Places API时TableView首行被导航栏遮挡的问题求助
解决Google Places Autocomplete TableView首行被导航栏遮挡的问题
这个问题我之前集成Google Places API时也碰到过,本质是GMSAutocompleteResultsViewController内部的TableView没有自动适配导航栏和安全区域的布局,不需要手动下移整个TableView,只需要调整它的滚动视图内边距或适配行为就能解决。
方案一:启用自动适配安全区域(推荐)
从iOS 11开始,苹果提供了更智能的滚动视图内边距调整机制,你可以在初始化resultsViewController后,设置它的TableView适配行为为自动模式,让系统根据导航栏、状态栏等布局自动调整内边距:
override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Search for Resturant" view.backgroundColor = .seGrey resultsViewController = GMSAutocompleteResultsViewController() resultsViewController?.delegate = self // 添加这部分代码解决遮挡问题 if #available(iOS 11.0, *) { resultsViewController?.tableView.contentInsetAdjustmentBehavior = .automatic } else { // 兼容iOS 11之前的版本 automaticallyAdjustsScrollViewInsets = true } searchController = UISearchController(searchResultsController: resultsViewController) searchController?.searchResultsUpdater = resultsViewController searchController?.searchBar.sizeToFit() navigationItem.titleView = searchController?.searchBar definesPresentationContext = true searchController?.hidesNavigationBarDuringPresentation = false }
方案二:手动设置内边距
如果自动适配不生效,你也可以手动计算导航栏+状态栏的总高度,给TableView设置顶部内边距:
override func viewDidLoad() { super.viewDidLoad() navigationItem.title = "Search for Resturant" view.backgroundColor = .seGrey resultsViewController = GMSAutocompleteResultsViewController() resultsViewController?.delegate = self // 手动计算顶部需要预留的高度 let statusBarHeight = UIApplication.shared.statusBarFrame.height let navigationBarHeight = navigationController?.navigationBar.frame.height ?? 0 let totalTopInset = statusBarHeight + navigationBarHeight resultsViewController?.tableView.contentInset = UIEdgeInsets(top: totalTopInset, left: 0, bottom: 0, right: 0) // 同步滚动指示器的内边距,保证视觉统一 resultsViewController?.tableView.scrollIndicatorInsets = resultsViewController?.tableView.contentInset ?? .zero searchController = UISearchController(searchResultsController: resultsViewController) searchController?.searchResultsUpdater = resultsViewController searchController?.searchBar.sizeToFit() navigationItem.titleView = searchController?.searchBar definesPresentationContext = true searchController?.hidesNavigationBarDuringPresentation = false }
额外注意点
确保你已经设置了definesPresentationContext = true,这个属性能保证搜索控制器在当前ViewController的上下文内正确展示,避免布局层级混乱导致的适配问题。
内容的提问来源于stack exchange,提问作者Andy Bernard
相关产品推荐
相关产品推荐

