Button 导航栏项目自动移动快捷界面
我试图在右侧显示一个导航栏项目,我几乎成功了,但在最后一刻我卡住了,我的导航右键在显示另一个视图后自动移动。请检查我的代码和下面给出的截图Button 导航栏项目自动移动快捷界面,button,swiftui,navigation,uinavigationbar,Button,Swiftui,Navigation,Uinavigationbar,我试图在右侧显示一个导航栏项目,我几乎成功了,但在最后一刻我卡住了,我的导航右键在显示另一个视图后自动移动。请检查我的代码和下面给出的截图 由于您的问题是(Xcode 12.4版(12D4e))中的一个bug,我们对此无能为力,因此我提供了一种解决此问题的自定义方法,如下所示: struct TrailingNavigationBarItems:ViewModifier{ 变量inputContent:()->inputContent func正文(内容:内容)->某些视图{ 返
由于您的问题是(Xcode 12.4版(12D4e))中的一个bug,我们对此无能为力,因此我提供了一种解决此问题的自定义方法,如下所示:
struct TrailingNavigationBarItems:ViewModifier{
变量inputContent:()->inputContent
func正文(内容:内容)->某些视图{
返回内容
.overlay(inputContent(),对齐方式:.TopTraining)
}
}
扩展视图{
func trailingNavigationBarItems(u-inputContent:@escaping()->inputContent)->一些视图{
return self.modifier(TrailingNavigationBarItems(inputContent:inputContent))
}
}
一种可能的解决方案是使用
工具栏而不是导航栏
:
struct NvaigationButton: View {
@State private var showPopUpFlgInapp = false
var body: some View {
NavigationView {
ZStack {
ScrollView {
VStack {
Image("DemoImage1")
.resizable()
.aspectRatio(16 / 9, contentMode: .fit)
}
Spacer()
}
}
.navigationBarTitle("", displayMode: .inline)
.edgesIgnoringSafeArea(.all)
.navigationBarBackButtonHidden(true)
.toolbar { // <- add here
ToolbarItem(placement: .navigationBarLeading) {
Button(action: {}) {
HStack {
Image("BackButtonWithColor")
}
}
}
ToolbarItem(placement: .navigationBarTrailing) {
trailingButton
}
}
}
}
var trailingButton: some View {
HStack {
if showPopUpFlgInapp != true {
Button(action: {
showPopUpFlgInapp = true
}) {
HStack {
Image("ThreeDotsWithBckground")
}
}
} else if showPopUpFlgInapp == true {
Text("") // this prevents `showFlagInAppr` from showing inline
showFlagInAppr(showPopUpFlgInapp: $showPopUpFlgInapp, action: {
showPopUpFlgInapp = false
})
}
}
}
}
struct nvagationButton:视图{
@国家私有变量showPopUpFlgInapp=false
var body:一些观点{
导航视图{
ZStack{
滚动视图{
VStack{
图像(“DemoImage1”)
.可调整大小()
.aspectRatio(16/9,内容模式:.fit)
}
垫片()
}
}
.navigationBarTitle(“,显示模式:。内联)
.edgesIgnoringSafeArea(.all)
.navigationBarBackButtonHidden(真)
.toolbar{//这肯定是一个bug,您的代码没有问题。我的Xcode版本12.3(12C33),我会检查您的解决方案。谢谢您的回复@Punk@ShamDhiman:不客气,因为我注意到这是一个bug,而且你的代码很好,我说我们不能等苹果来修复,我试着用我的方式修复它。
import SwiftUI
struct ContentView: View {
var body: some View {
NvaigationButton()
}
}
struct NvaigationButton: View {
@State private var showPopUpFlgInapp = false
var body: some View {
NavigationView {
ZStack {
Text("Hello World!")
}
.navigationBarTitle("", displayMode: .inline)
.edgesIgnoringSafeArea(.all)
.navigationBarBackButtonHidden(true)
}
.trailingNavigationBarItems { trailingButton.padding() } // <<: Apply Here!
}
var trailingButton: some View {
HStack {
if showPopUpFlgInapp != true {
Button(action: {
showPopUpFlgInapp = true
}) {
HStack {
Image(systemName: "star")
}
}
}else if showPopUpFlgInapp == true {
showFlagInAppr(showPopUpFlgInapp:$showPopUpFlgInapp,action: {
showPopUpFlgInapp = false
})
}
}
}
}
struct showFlagInAppr: View {
@Binding var showPopUpFlgInapp: Bool
var action: () -> Void
var body: some View {
if showPopUpFlgInapp {
ZStack {
VStack(alignment:.leading,spacing:30) {
Button(action: action, label: {
Text("Flag as inappropriate")
})
}
}
.padding(20)
.background(Color.init(UIColor.init(displayP3Red: 29/255, green: 33/255, blue: 33/255, alpha: 1.0)))
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
struct TrailingNavigationBarItems<InputContent: View>: ViewModifier {
var inputContent: () -> InputContent
func body(content: Content) -> some View {
return content
.overlay(inputContent(), alignment: .topTrailing)
}
}
extension View {
func trailingNavigationBarItems<InputContent: View>(_ inputContent: @escaping () -> InputContent) -> some View {
return self.modifier(TrailingNavigationBarItems(inputContent: inputContent))
}
}
struct NvaigationButton: View {
@State private var showPopUpFlgInapp = false
var body: some View {
NavigationView {
ZStack {
ScrollView {
VStack {
Image("DemoImage1")
.resizable()
.aspectRatio(16 / 9, contentMode: .fit)
}
Spacer()
}
}
.navigationBarTitle("", displayMode: .inline)
.edgesIgnoringSafeArea(.all)
.navigationBarBackButtonHidden(true)
.toolbar { // <- add here
ToolbarItem(placement: .navigationBarLeading) {
Button(action: {}) {
HStack {
Image("BackButtonWithColor")
}
}
}
ToolbarItem(placement: .navigationBarTrailing) {
trailingButton
}
}
}
}
var trailingButton: some View {
HStack {
if showPopUpFlgInapp != true {
Button(action: {
showPopUpFlgInapp = true
}) {
HStack {
Image("ThreeDotsWithBckground")
}
}
} else if showPopUpFlgInapp == true {
Text("") // this prevents `showFlagInAppr` from showing inline
showFlagInAppr(showPopUpFlgInapp: $showPopUpFlgInapp, action: {
showPopUpFlgInapp = false
})
}
}
}
}