如何在 SwiftUI 中重新定位导航栏按钮

Posted

技术标签:

【中文标题】如何在 SwiftUI 中重新定位导航栏按钮【英文标题】:How to re-position Navigation Bar Buttons in SwiftUI 【发布时间】:2019-11-19 00:01:09 【问题描述】:

我已经实现了navigationBarTitle,我正在尝试实现navigationBarItem,但是默认位置看起来很奇怪。

我希望能够将“下一步”按钮与navigationBarTitle 对齐。我能够用这段代码完成一些事情:

.navigationBarTitle(Text("Names"))
.navigationBarItems(trailing:
            Button(action: 
                print("tapped")
            ) 
                Group 
                    Text("Next")
                .position(x: 0, y: 60).background(Color.purple)

            )

但是问题在于按钮没有移动,因此在显示“下一步”的位置无法点击。 (我突出显示了紫色的位置来演示。)

有没有办法以更清洁的方式完成此任务?或者我可以在 SwiftUI 中保持 navigationBarTitle Large Tile 外观的同时实现的其他方法或堆栈?谢谢!

【问题讨论】:

【参考方案1】:

您可以将按钮包装在ZStack 中,并将Button 放置在ZStack 中,如下所示:

import UIKit
import PlaygroundSupport
import SwiftUI

 struct ContentView: View 
    var body: some View 
        NavigationView 
            Text("Names")
                .navigationBarTitle(Text("Names"))
                .navigationBarItems(trailing:
                    ZStack 
                            Button(action: 
                                print("tapped")
                            ) 
                                Group 
                                    Text("Next")
                                .background(Color.purple)
                            .position(x: 0, y: 60)
                        )
        
    


let viewController = UIHostingController(rootView: ContentView())

PlaygroundPage.current.liveView = viewController

我在上面的操场示例中尝试过,它成功了:

编辑:

这似乎会使按钮无响应,除非您触摸并拖动:

【讨论】:

有趣,我试过这个,当我点击它时它使我的按钮没有响应。我尝试将.position 修饰符移动到组的末尾和按钮的末尾,但没有成功。当(x: 0, y: 0) 时它是响应式的。 嗯,这似乎是 SwiftUI 的一个错误。我能够按下按钮,但前提是我从按钮的右上方单击并向下拖动。我将用这个奇怪行为的剪辑来编辑我的答案。 在您提供可能相关的工作表后,大型导航栏标题中的导航栏按钮无法正常工作:***.com/a/58512956/296708。您可以按下按钮,但只能使用拖动手势。 啊,这很有趣,我在运行它时也看到了相同的行为。感谢您的帮助!

以上是关于如何在 SwiftUI 中重新定位导航栏按钮的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 导航栏项目中难以点击的按钮

从 SwiftUI 中的导航栏中删除后退按钮文本

更新 SwiftUI 导航栏标题

SwiftUI 搜索栏与导航栏一致

隐藏导航栏但保留后退按钮 - SwiftUI

SwiftUI:模式关闭后导航栏中的按钮不会触发