SwiftUI 导航栏中的后退按钮还没有简单的自定义方法吗?

如何解决SwiftUI 导航栏中的后退按钮还没有简单的自定义方法吗?

您现在可以使用 .toolbar-modifier 随意设置 NavigationBar 主体内容

.toolbar {
    ToolbarItem(placement: .principal) {
        Text("Custom Title")
            .font(.title)
    }
}

是否有一种同样简单的方法自定义后退按钮(文本和/或整个按钮),而不涉及隐藏认按钮并创建自己的按钮,然后还需要重新创建正确的功能(即实际上返回并启用滑动返回)?

解决方法

使用UIButton()

struct ToolbarButton: UIViewRepresentable {

    private let sfSymbolName: String
    
    private let titleColor: UIColor
    
    private let action: () -> ()
    
    internal init(sfSymbolName: String,titleColor: UIColor,action: @escaping () -> ()) {
        self.sfSymbolName = sfSymbolName
        self.titleColor = titleColor
        self.action = action
    }

    
    func makeUIView(context: Context) -> UIButton {
        let button = UIButton()
        let largeConfig = UIImage.SymbolConfiguration(scale: .large)


        // Use custom icon instead of system icons.

        let image = UIImage(systemName: sfSymbolName,withConfiguration: largeConfig)
        button.setImage(image,for: .normal)
        button.tintColor = titleColor
        button.contentEdgeInsets = UIEdgeInsets(top: 4,left: 4,bottom: 4,right: 4)
        button.addTarget(context.coordinator,action: #selector(context.coordinator.didTapButton(_:)),for: .touchUpInside)
        return button
    }
    
    func updateUIView(_ uiView: UIButton,context: Context) {}
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(action: action)
    }
    
    
    class Coordinator {
        private let action: () -> ()
        
        init(action: @escaping () -> ()) {
            self.action = action
        }
        
        @objc
        func didTapButton(_ sender: UIButton) {
            self.action()
        }
    }
}

struct CloseButton: View {
    var onClose: () -> ()
    var spacing: CGFloat

    init(spacing: CGFloat = 2,onClose: @escaping () -> ()) {
        self.spacing = spacing
        self.onClose = onClose
    }
    
    var body: some View {
        ToolbarButton(sfSymbolName: "plus",titleColor: UIColor(Color.accentColor),action: self.onClose)
            .rotationEffect(.degrees(45),anchor: .center)
            .padding(2)
            .background(Circle().fill(Color.systemGray2))
            .padding(2)
            .animation(.easeOut)
    }
}
,

同样简单,没有办法做到。 SwiftUI 用于基本编码,它是一个入门包。

但是,如果您在 UIKit 真正发生奇迹的地方使用它,它并没有比选择您想要修改的内容并告诉它您想要的内容更简单。

下面的代码是一般的导航栏,背景,标题,后退按钮图片,后退按钮标题等。它会影响你的整个应用程序。它并不完整,有一些快速说明,但您应该对如何制作自己的作品有一个不错的了解。

struct HomeView: View{
    @State var ispresented = true
    var body: some View {
        ZStack {
            NavigationView {
                NavigationLink(
                    destination: ListView(),isActive: $ispresented,label: {
                        Text("List View")
                    }).navigationTitle("Home")
            }
        }
    }
}
struct ListView: View{
    init() {
    }
    var body: some View {
        ZStack {
            List{
                Text("List")
            }.navigationTitle("Sample")
            
        }
    }
}
struct HomeView_Previews: PreviewProvider {
    static var previews: some View {
        HomeView()
    }
}
extension UINavigationController {
    
    override open func viewDidLoad() {
        super.viewDidLoad()
        
        //.inline
        let standard = navigationBar.standardAppearance
        standard.backgroundColor = .blue
        standard.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.yellow,NSAttributedString.Key.font: UIFont(name: UIFont.familyNames[4],size: 20)!]
        //This one is for standard and compact
        standard.setBackIndicatorImage(UIImage(systemName: "checkmark"),transitionMaskImage: UIImage(systemName: "checkmark"))
        
        //Landscape
        let compact = navigationBar.compactAppearance
        compact?.backgroundColor = .blue
        compact?.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.red]
        
        //.large
        let scrollEdge = navigationBar.standardAppearance
        //This image overrides standard and compact
        scrollEdge.setBackIndicatorImage(UIImage(systemName: "plus"),transitionMaskImage: UIImage(systemName: "plus"))
        
        scrollEdge.backgroundColor = .blue
        
        scrollEdge.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.green,NSAttributedString.Key.font: UIFont(name: UIFont.familyNames[2],size: 48)!]
        
        scrollEdge.backButtonAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.magenta]
        
        navigationBar.standardAppearance = standard
        navigationBar.compactAppearance = compact
        navigationBar.scrollEdgeAppearance = scrollEdge
        
        //This color the Back Button Image
        navigationBar.tintColor = .brown
        
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?