SwiftUI 中自定义导航栏返回、后退按钮

SwiftUI 暂时(Xcode 14,iOS 16)还没有原生的方法来自定义导航栏返回按钮的外观样式,我们可以通过使用 UIKit 的的方式做一点修改。


使用 UINavigationBar.appearance() 全局修改

例如下方代码,在App入口处设置,将更改所有 UINavigationBar 的默认返回图标

@main
struct CodeunDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onAppear {
                    UINavigationBar.appearance().backIndicatorImage = UIImage(systemName: "arrow.backward")
                    UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(systemName: "arrow.backward")
                }
        }
    }
}

单独设置页面的返回按钮

因为目前没有合适的原生的方法来自定义,这里建议关闭掉默认的导航栏返回,使用 toolbar 重新模拟一个返回按钮放置在相同位置,但是这样做会失去默认的边缘滑动返回效果。

  • 使用 .navigationBarBackButtonHidden(true) 隐藏关闭页面的返回按钮
  • 使用 toolbar 添加一个导航工具栏
  • toolbar 中添加 ToolbarItem 按钮,设置 .navigationBarLeading 放在默认返回按钮位置
  • 自定义 ToolbarItem 返回按钮的外观样式
  • 使用 .dismiss() 实现返回上一页效果
    • iOS 15 及以上版本使用 @Environment(\.dismiss) private var dismiss
    • iOS 15 以下版本使用 @Environment(\.presentationMode) var presentationMode

示例代码

import SwiftUI

struct IndexView: View {
    
    @Environment(\.dismiss) private var dismiss
    // iOS 15 以下版本使用
    // @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        VStack {
            Text("Hello, World!")
        }
        .navigationBarBackButtonHidden(true)
        .toolbar {
            ToolbarItem(placement: .navigationBarLeading) {
                Button {
                    dismiss()
                    // iOS 15 以下版本使用
                    // presentationMode.wrappedValue.dismiss()
                } label: {
                    HStack {
                        
                        Image(systemName: "arrow.backward")
                        Text("返回")
                    }
                }
            }
        }
    }
}

  本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
  · 如若转载,请注明出处:https://www.codeun.com/archives/1057.html ·

(2)
上一篇 2023-04-11 下午9:43
下一篇 2023-04-13 上午11:08

发表回复

登录后才能评论