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

iOS APP中如何在UINavigationBar上方添加全屏宽度图片横幅?

解决UINavigationBar上方添加全屏横幅的方案

方案一:给导航控制器的view添加顶部横幅

直接在导航控制器的view最上层添加全屏宽度的图片视图,再调整导航栏位置适配布局,同时处理页面滚动视图的内容偏移避免遮挡。

代码示例(Swift):

// 在自定义导航控制器的viewDidLoad中实现
override func viewDidLoad() {
    super.viewDidLoad()
    
    // 创建横幅图片视图
    let bannerImageView = UIImageView(image: UIImage(named: "your_banner_image"))
    bannerImageView.contentMode = .scaleToFill
    bannerImageView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(bannerImageView)
    
    // 设置约束:填满屏幕宽度,固定高度,顶部对齐view顶部
    NSLayoutConstraint.activate([
        bannerImageView.topAnchor.constraint(equalTo: view.topAnchor),
        bannerImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        bannerImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        bannerImageView.heightAnchor.constraint(equalToConstant: 80)
    ])
    
    // 让导航栏下移到横幅下方
    navigationBar.frame.origin.y = 80
    
    // 适配滚动视图:如果当前页面有滚动视图,调整内容内边距避免被导航栏遮挡
    if let scrollView = topViewController?.view as? UIScrollView {
        scrollView.contentInset.top = navigationBar.frame.height + 80
        scrollView.scrollIndicatorInsets = scrollView.contentInset
    }
}

方案二:自定义UINavigationBar嵌入顶部横幅

把横幅作为导航栏的子视图,同时调整导航栏的整体高度和内部内容偏移,让横幅和原有导航栏元素共存。

代码示例(Swift):

class CustomNavigationBar: UINavigationBar {
    private let bannerImageView = UIImageView()
    private let bannerHeight: CGFloat = 80
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupBanner()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupBanner()
    }
    
    private func setupBanner() {
        bannerImageView.image = UIImage(named: "your_banner_image")
        bannerImageView.contentMode = .scaleToFill
        bannerImageView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(bannerImageView)
        
        // 固定横幅在导航栏顶部,填满宽度
        NSLayoutConstraint.activate([
            bannerImageView.topAnchor.constraint(equalTo: topAnchor),
            bannerImageView.leadingAnchor.constraint(equalTo: leadingAnchor),
            bannerImageView.trailingAnchor.constraint(equalTo: trailingAnchor),
            bannerImageView.heightAnchor.constraint(equalToConstant: bannerHeight)
        ])
        
        // 调整导航栏内部元素的偏移,让标题、按钮显示在横幅下方
        let insets = UIEdgeInsets(top: bannerHeight, left: 0, bottom: 0, right: 0)
        layoutMargins = insets
        titleVerticalPositionAdjustment = bannerHeight
    }
    
    // 重写尺寸计算,让导航栏高度增加横幅的高度
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var originalSize = super.sizeThatFits(size)
        originalSize.height += bannerHeight
        return originalSize
    }
}

// 使用自定义导航栏
let navController = UINavigationController(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
navController.viewControllers = [yourRootViewController]

关键注意点

  • 图片需设置contentMode = .scaleToFill才能拉伸填满屏幕宽度
  • 刘海屏适配:确保导航控制器的edgesForExtendedLayout包含.top,让横幅可以延伸到刘海区域
  • 方案一要注意页面跳转时的横幅一致性,建议在自定义导航控制器中统一处理

内容的提问来源于stack exchange,提问作者andres padilla gravier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:46:02