You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:23:06