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

SwiftUI中点击UISearchBar时UIScrollView出现跳转问题如何解决?

问题原因

将UISearchController绑定到navigationItem后,UIKit默认会自动调整当前视图控制器下所有可滚动视图的内边距,适配搜索栏激活后的布局变化,你的自定义UIScrollView被系统检测到后偏移量被强制修改,就出现了自动跳转的问题。

解决方案

方案一:禁止系统自动调整滚动视图内边距(推荐使用)

无需修改原有页面布局,仅需要修改两处配置即可:

  1. 修改UIScrollViewViewController中UIScrollView的初始化代码,添加禁止自动调整内边距的配置:
lazy var scrollView: UIScrollView = {
    let v = UIScrollView()
    v.isPagingEnabled = false
    v.alwaysBounceVertical = true
    // 新增以下配置
    if #available(iOS 11.0, *) {
        v.contentInsetAdjustmentBehavior = .never
    } else {
        (v.superview?.next as? UIViewController)?.automaticallyAdjustsScrollViewInsets = false
    }
    return v
}()
  1. 修改SearchBarModifier中的ViewControllerResolver回调代码,禁止视图延伸到导航栏下方,避免内容被遮挡:
ViewControllerResolver { viewController in
    viewController.navigationItem.searchController = self.searchBar.searchController
    viewController.navigationItem.hidesSearchBarWhenScrolling = false
    // 新增以下两行配置
    viewController.edgesForExtendedLayout = []
    viewController.automaticallyAdjustsScrollViewInsets = false
}

方案二:手动保存恢复滚动偏移量

如果需要保留系统自动调整内边距的行为,可以通过监听搜索栏的激活状态手动处理偏移量:

  1. 给SearchBar添加UISearchControllerDelegate代理,监听激活事件:
override init() {
    super.init()
    self.searchController.obscuresBackgroundDuringPresentation = false
    self.searchController.searchResultsUpdater = self
    // 新增代理设置
    self.searchController.delegate = self
}
  1. 实现代理方法,在搜索栏激活前后保存、恢复滚动偏移量:
extension SearchBar: UISearchControllerDelegate {
    func willPresentSearchController(_ searchController: UISearchController) {
        // 此处获取你的UIScrollView实例,保存当前的contentOffset值
    }
    func didPresentSearchController(_ searchController: UISearchController) {
        // 系统完成布局调整后,将scrollView的contentOffset恢复为之前保存的值
    }
}

该方案需要自行实现scrollView实例的获取和偏移量传递逻辑,适合有特殊布局需求的场景。

内容的提问来源于stack exchange,提问作者sheldor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:57:00