SwiftUI: Как отобразить вид в виде всплывающего окна поверх текущего вида, размытого на заднем плане? - PullRequest
0 голосов
/ 08 января 2020

При нажатии кнопки я хочу иметь возможность отображать вид (округленный прямоугольник с информацией о профиле) поверх текущего вида (список всех профилей), размытый на заднем плане.

Ниже я пытаюсь добраться до

enter image description here enter image description here

Это то, что я сейчас есть

import SwiftUI

struct profileList: View {
    var list: [String]

    @State var displayItem: Int = -1

    var body: some View {
        VStack (spacing: 20){
            Text("Profile List").fontWeight(.bold)
                .padding(.bottom, 80)

            ForEach(0 ..< list.count) {number in
                Button(action: {self.displayItem = number}) { Text(self.list[number]) }
            }


            if (displayItem != -1) {
                profileInfo(text: list[self.displayItem])
                    .padding(.top, -350)
            }
            Spacer()
        }
    }
}

struct profileInfo: View {
    var text: String
    var body: some View {
        VStack {
            Spacer()
            HStack {
                VStack(spacing: 20) {
                    Text(text).fontWeight(.bold).padding(.all, 20)

                    Text("Name")
                    Text("Age")
                    Text("Profession")
                    Text("Interest")
                }
            }
            .frame(minWidth: 300, idealWidth: 300, maxWidth: 300, minHeight: 250, idealHeight: 100, maxHeight: 250, alignment: .top).fixedSize(horizontal: true, vertical: true)
            .background(RoundedRectangle(cornerRadius: 27).fill(Color.white.opacity(1)))
            .overlay(RoundedRectangle(cornerRadius: 27).stroke(Color.black, lineWidth: 1))
            Spacer()
        }
    }
}

struct contentView4_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            profileList(list: ["ABC", "DEF", "GHI", "JKL", "MNO", "PQR"])
            profileInfo(text: "XYZ")
        }
    }
}

Любая помощь высоко ценится, заранее спасибо

1 Ответ

1 голос
/ 08 января 2020

Вы должны сделать что-то вроде этого

import SwiftUI

struct ProfileList: View {
var list: [String]

@State var displayItem: Int = -1

var body: some View {
    ZStack{
        VStack (spacing: 20){
            Text("Profile List").fontWeight(.bold)
                .padding(.bottom, 80)

            ForEach(0 ..< list.count) {number in
                Button(action: {self.displayItem = number}) { Text(self.list[number]) }
            }
        }


        if (displayItem != -1) {
            ProfileInfo(text: list[self.displayItem], displayItem: $displayItem)
                .padding(.top, -350)
        }
        Spacer()
    }.animation(.easeInOut)
  }
}

struct ProfileInfo: View {
var text: String
@Binding var displayItem:Int

var body: some View {
    ZStack{
        Rectangle()
        .fill(Color.gray)
        .opacity(0.5)

        VStack {
            Spacer()
            HStack {
                VStack(spacing: 20) {
                    Text(text).fontWeight(.bold).padding(.all, 20)

                    Text("Name")
                    Text("Age")
                    Text("Profession")
                    Text("Interest")
                }
            }
            .frame(minWidth: 300, idealWidth: 300, maxWidth: 300, minHeight: 250, idealHeight: 100, maxHeight: 250, alignment: .top).fixedSize(horizontal: true, vertical: true)
            .background(RoundedRectangle(cornerRadius: 27).fill(Color.white.opacity(1)))
            .overlay(RoundedRectangle(cornerRadius: 27).stroke(Color.black, lineWidth: 1))
            Spacer()
        }
    }.onTapGesture {
        self.displayItem = -1
    }
  }
}

struct ProfileList_Previews: PreviewProvider {
static var previews: some View {
    ProfileList(list: ["ABC", "DEF", "GHI", "JKL", "MNO", "PQR"])
  }
}
...