Xcode SwiftUI-弹出图像/文本

Xcode SwiftUI-弹出图像/文本,xcode,swiftui,Xcode,Swiftui,我正在写一个游戏(我的第一个),我已经设置好了棋盘,并且代码可以为游戏工作。我正在使用SwiftUI堆叠主屏幕。我现在想在玩家扔下一个字母时弹出一个文本/图像。我看过很多游戏,但找不到任何关于如何完成的帮助或指导 import SwiftUI struct ContentView: View { @State private var showLetters = [String](repeating: "Blank", count: 36) @State private

我正在写一个游戏(我的第一个),我已经设置好了棋盘,并且代码可以为游戏工作。我正在使用SwiftUI堆叠主屏幕。我现在想在玩家扔下一个字母时弹出一个文本/图像。我看过很多游戏,但找不到任何关于如何完成的帮助或指导

    import SwiftUI


struct ContentView: View {
    @State private var showLetters = [String](repeating: "Blank", count: 36)
    @State private var testLetters = [String](repeating: "Blank", count: 7)
    @State private var originalLetters = [String](repeating: "Blank", count: 7)
    @State private var tray = [String](repeating: "Blank", count: 7)
    @State private var buttonFrames = [CGRect](repeating: .zero, count: 35)
    @State private var score = 0
    @State private var lineNo = 0

    @State var displayItem: Int = -1

    let allowedWords = Bundle.main.words(from: "words.txt")

    var body: some View {


        VStack(spacing: 5) {

            Image("word5sm")


            HStack {
                ForEach(0..<7) { number in
                    Letter(text: self.showLetters[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)
                        .allowsHitTesting(false)
                        .overlay(
                            GeometryReader { geo in
                                Color.clear
                                    .onAppear {
                                        self.buttonFrames[number] = geo.frame(in: .global)

                                    }
                            }
                        )


                }


            }


            HStack {ForEach(7..<14) { number in
                Letter(text: self.showLetters[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)
                                   .allowsHitTesting(false)
                                   .overlay(
                                       GeometryReader { geo in
                                           Color.clear
                                               .onAppear {
                                                  self.buttonFrames[number] = geo.frame(in: .global)
                                               }
                                       }
                                   )
                }
            }


            HStack {ForEach(14..<21) { number in
                Letter(text: self.showLetters[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)
                                   .allowsHitTesting(false)
                                   .overlay(
                                       GeometryReader { geo in
                                           Color.clear
                                               .onAppear {
                                                  self.buttonFrames[number] = geo.frame(in: .global)
                                               }
                                       }
                                   )
                }
            }

            HStack {ForEach(21..<28) { number in
                Letter(text: self.showLetters[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)
                                   .allowsHitTesting(false)
                                   .overlay(
                                       GeometryReader { geo in
                                           Color.clear
                                               .onAppear {
                                                  self.buttonFrames[number] = geo.frame(in: .global)
                                               }
                                       }
                                   )
                }
            }

            HStack {ForEach(28..<35) { number in
                Letter(text: self.showLetters[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)
                                   .allowsHitTesting(false)
                                   .overlay(
                                       GeometryReader { geo in
                                           Color.clear
                                               .onAppear {
                                                  self.buttonFrames[number] = geo.frame(in: .global)
                                               }
                                       }
                                   )
                }
            }

            HStack {

                    ResetButton {
                        self.returnLetters()
                    }

                    NewLine {
                        self.newLine()
                    }

                    CalcButton {
                        self.calcButton()
                    }

                   }

            HStack {
                ForEach(0..<7) { number in
                    Letter(text: self.tray[number], index: number, onChanged: self.letterMoved, onEnded: self.letterDropped)

                }


            }




        }
        .frame(width: 768, height: 856)
        .background(Image("Background"))
        .onAppear(perform: startGame)
        .allowsHitTesting(true)

        }



This is my code for the main screen....
导入快捷界面
结构ContentView:View{
@国家私有变量showLetters=[String](重复:“空白”,计数:36)
@国家私有var testLetters=[String](重复:“空白”,计数:7)
@国家私有变量originalLetters=[String](重复:“空白”,计数:7)
@国家私有变量托盘=[String](重复:“空白”,计数:7)
@状态私有变量buttonFrames=[CGRect](重复:.0,计数:35)
@国有私营企业风险值得分=0
@国家私有变量lineNo=0
@状态变量displayItem:Int=-1
让allowedWords=Bundle.main.words(来自:“words.txt”)
var body:一些观点{
VStack(间距:5){
图像(“word5sm”)
HStack{

ForEach(0..我可能误解了你的要求。我不能用你的例子,所以我不得不自己做:

这就利用
ZStack
GameView
上方通过
转换
绘制
文本
…注意
带动画
块以激活转换

struct GameView: View {
    @Binding var showText: Bool
    var body: some View {
        VStack {
            Rectangle()
                .foregroundColor(.blue)
            .frame(width: 80, height: 180)
            Circle()
                .foregroundColor(.red)
            .frame(width: 50)
            Rectangle()
                .foregroundColor(.green)
            .frame(width: 150, height: 110)
        }
    }
}

struct ContentView: View {

    @State var showText = false

    var body: some View {
        ZStack {
            VStack {
                GameView(showText: self.$showText)
                Button(action: {
                    withAnimation {
                        self.showText.toggle()
                    }
                }, label: {
                    Text("Show / Hide Text")
                })
            }
            if self.showText {
                VStack {
                    Spacer()
                    HStack {
                        Spacer()
                        Text("Hello I am a Text")
                            .foregroundColor(.orange)
                            .font(.system(.largeTitle))
                            .transition(.opacity)
                        Spacer()
                    }
                    Spacer()
                }
            }
        }
    }

}

我希望这能有所帮助!

我可能误解了你的要求。我不能用你的例子,所以我不得不自己做:

这就利用
ZStack
GameView
上方通过
转换
绘制
文本
…注意
带动画
块以激活转换

struct GameView: View {
    @Binding var showText: Bool
    var body: some View {
        VStack {
            Rectangle()
                .foregroundColor(.blue)
            .frame(width: 80, height: 180)
            Circle()
                .foregroundColor(.red)
            .frame(width: 50)
            Rectangle()
                .foregroundColor(.green)
            .frame(width: 150, height: 110)
        }
    }
}

struct ContentView: View {

    @State var showText = false

    var body: some View {
        ZStack {
            VStack {
                GameView(showText: self.$showText)
                Button(action: {
                    withAnimation {
                        self.showText.toggle()
                    }
                }, label: {
                    Text("Show / Hide Text")
                })
            }
            if self.showText {
                VStack {
                    Spacer()
                    HStack {
                        Spacer()
                        Text("Hello I am a Text")
                            .foregroundColor(.orange)
                            .font(.system(.largeTitle))
                            .transition(.opacity)
                        Spacer()
                    }
                    Spacer()
                }
            }
        }
    }

}

我希望这有帮助!

您可以使用
ZStack
if
语句,根据
Bool
状态显示或隐藏
文本。使用
transition
添加精美的动画…您的示例显然不适合我,因为您没有提供运行它所需的所有代码。您可以使用
ZStack
带有
if
语句,根据
Bool
状态显示或隐藏
文本。使用
transition
添加奇特的动画…您的示例显然不适合我,因为您没有提供运行该示例所需的所有代码。谢谢您,非常理想,并了解其工作原理。再次感谢此works很好,我也可以使用图像而不是文本。问题是,我在GameView或ContentView之外有一些函数,我(可以)怎么做从这些函数中更改showText bool?这取决于它们的位置……如果这回答了您的问题,请接受。如果您还有其他问题,请提出新问题。@Lynxbcia接受,谢谢。这些函数都在GameView中,但我似乎无法从GameView中设置showText。我将尝试发布新问题,但我不知道我在问什么。在
GameView
中使用
Binding
,并从
ContentView
中传递它……然后你可以在内部更改它!谢谢你,理想的,并了解它是如何工作的。再次感谢这项工作很好,我也可以使用图像而不是文本。问题,我在GameView或ContentView之外有一些函数,如何使用我会(我能)从这些函数中更改showText bool?这取决于它们的位置……如果这回答了您的问题,请接受。如果您还有其他问题,请提出新问题。@Lynxbcia接受,谢谢。这些函数都在GameView中,但我似乎无法从GameView中设置showText。我将尝试发布新问题,但不确定我在问什么,请在
GameView
中使用
Binding
,并从
ContentView
中传递它……然后您可以在中更改它!