在添加和删除第二个按钮时保持 SwiftUI 中的导航项按钮对齐

Posted

技术标签:

【中文标题】在添加和删除第二个按钮时保持 SwiftUI 中的导航项按钮对齐【英文标题】:Maintain navigation item button alignment in SwiftUI as second button is added & removed 【发布时间】:2020-07-02 15:11:36 【问题描述】:

我有一个场景,根据某些标准会有一个或两个尾随按钮。我希望按钮始终与尾部对齐以保持视觉一致性,但到目前为止,无论我做什么,它们似乎都居中对齐。

以下是显示此内容的最小示例:

import SwiftUI

struct ContentView: View 
    @State private var isButtonShown = true

    var body: some View 
        NavigationView 
            Button(action: 
                self.isButtonShown.toggle()
            , label: 
                Text(self.isButtonShown ? "Hide Button" : "Show Button")
                     )
                .navigationBarItems(trailing:
                    HStack 
                        if self.isButtonShown 
                            Button(action: 
                                print("A tapped")
                            , label: 
                                Text("A")
                            )
                            Spacer(minLength: 30)
                        

                        Button(action: 
                            print("B tapped")
                        , label: 
                            Text("B")
                        )
                    
                    .frame(alignment: .trailing)
                )
        
    

还有一段视频显示了当我选择按钮时会发生什么。

我的目标是让 B 保持在同一位置,无论是否显示 A。

最后,我尝试了其他一些项目:

.frame(alignment: .trailing) 移至NavigationView 级别 在self.isButtonShown 之后添加了else,添加了Spacer().frame(alignment: .trailing) 应用于B Button

【问题讨论】:

【参考方案1】:

这是 SwiftUI 1.0 中已知的问题

SwiftUI 2.0

基于new.toolbar的解决方案没有。使用 Xcode 12 / ios 14 测试

struct ContentView: View 
    @State private var isButtonShown = true

    var body: some View 
        NavigationView 
            Button(action: 
                self.isButtonShown.toggle()
            , label: 
                Text(self.isButtonShown ? "Hide Button" : "Show Button")
                     )
            .toolbar 
                ToolbarItem(placement: .primaryAction) 
                    if self.isButtonShown 
                        Button(action: 
                            print("A tapped")
                        , label: 
                            Text("A")
                        )
                    
                

                ToolbarItem(placement: .primaryAction) 
                    Button(action: 
                        print("B tapped")
                    , label: 
                        Text("B")
                    )
                
            
        
    

【讨论】:

以上是关于在添加和删除第二个按钮时保持 SwiftUI 中的导航项按钮对齐的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 视图之间的导航

如何在 SwiftUI 中一个接一个地显示多个警报对话框?

SwiftUI - 如何关闭假的模态视图 - 从里面的第二个视图,用关闭按钮?

SwiftUI:关闭第一个工作表时如何显示第二个工作表

带有 navigationLink 的 SwiftUI 消失后退按钮

SwiftUI .swipeactions 和核心数据