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

UINavigationBar大标题模式下searchBar无法正常显示问题求助

解决方案

  • 给自定义下拉按钮显式设置尺寸约束
    UIBarButtonItem的customView不会自动适配内容尺寸,你用SnapKit可以直接在初始化按钮时添加约束,数值可根据你的按钮实际内容调整,参考代码:
    lazy var button = UIDropDownButton().then {
        // 新增宽高约束
        $0.snp.makeConstraints { make in
            make.width.equalTo(90)
            make.height.equalTo(32)
        }
        $0.setAction().subscribe(onNext: {
            switch $0 {
            case .popularity: break
                // 人气排序代码
            case .suggestion: break
                // 推荐排序代码
            case .lowestPrice: break
                // 最低价格排序代码
            }
        })
        .disposed(by: disposeBag)
    }
    
  • 删除viewWillAppear中的重复导航栏设置代码
    你当前在viewDidLoad和viewWillAppear中重复调用setNavigationBar(),会重复生成并赋值rightBarButtonItem、searchController,引发布局冲突,只保留viewDidLoad中的调用即可。
  • 如果按钮位置存在偏移,可添加容器视图修正
    自定义customView在导航栏中默认对齐方式可能不符合预期,外层套一层容器视图调整边距即可:
    lazy var barButtonItem: UIBarButtonItem = {
        let container = UIView()
        container.addSubview(button)
        button.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.trailing.equalToSuperview().offset(-4) // 根据需要调整右边距
            make.width.height.equalTo(button.intrinsicContentSize)
        }
        container.snp.makeConstraints { make in
            make.size.equalTo(CGSize(width: 94, height: 32))
        }
        return UIBarButtonItem(customView: container)
    }()
    
  • 补充searchController的必要配置
    大标题模式下默认搜索栏会折叠在导航栏顶部,可显式添加配置避免异常:
    private func setNavigationBar() {
        setLargeTitleNavigationBar(title: "产品")
        self.navigationItem.rightBarButtonItem = barButtonItem
        let searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self // 按需设置代理
        self.navigationItem.searchController = searchController
        self.navigationItem.hidesSearchBarWhenScrolling = true // 滚动时隐藏搜索栏
    }
    
  • 可选修正:你扩展中的setBackButon()存在拼写错误,正确应为setBackButton(),如果是自定义方法注意检查实现是否有问题。

内容的提问来源于stack exchange,提问作者장서영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:06