Как создать DropDownMenu в SwiftUI? - PullRequest
0 голосов
/ 20 января 2020

Мне нужно создать DropDownMenu, используя SwiftUI. Наконец, я создал DropDownMenu, где есть проблема, когда следующие ближайшие братья и сестры этого DropDownMenu VStack переместились из положения по умолчанию, когда он расширяется, а высота VStack увеличивается динамически. Пожалуйста, найдите следующий вид:

enter image description here

На самом деле мне нужен настоящий DropDownMenu, как обычно мы используем в Настольное приложение . Взгляните на мой код следующим образом:

import UIKit
import SwiftUI

public struct DropDownMenu: View {
    @State var expanded: Bool = false

    public var body: some View {
        let marineGreen : Color = Color(UIColor.parse(0x346C7C))
        let whitishGreen: Color = Color(UIColor.parse(0xE7EEEF))
        let genders: [String]   = ["Male", "Female", "Unknown"]
        let width  : CGFloat    = 140

        let menu = VStack(alignment: .leading){
            HStack{
                Text("Gender").fontWeight(.heavy).foregroundColor(whitishGreen)
                Image(systemName: self.expanded ? "chevron.up" : "chevron.down").resizable().frame(width: 13, height: 6).foregroundColor(whitishGreen)
            }.onTapGesture {
                self.expanded.toggle()
            }.frame(width: width)
            if (self.expanded) {
                ForEach(0 ..< genders.count, id: \.self) {
                    self.menuItem(genders[$0], width, whitishGreen)
                }
            }
        }
        .padding().frame(width: width)
        .background(self.expanded ? marineGreen.opacity(0.9) : marineGreen)
        .animation(.none)
        .onTapGesture {
            self.expanded.toggle()
        }
        return menu
    }

    private func menuItem(_ gender: String, _ width: CGFloat, _ color: Color) -> some View {
        let padding: CGFloat = 20
        let height : CGFloat = 20

        return VStack {
            Divider().background(color)
            Button(action: {self.expanded.toggle()}){
                Text("\(gender)").frame(height: height).padding([.leading, .trailing], padding)
            }
            .frame(minWidth: width).contentShape(Rectangle())
            .foregroundColor(color)
        }
    }
}

Расширение UIColor:

extension UIColor {
    static func parse(_ hex: UInt32, alpha: Double = 1.0) -> UIColor {
        let red   = CGFloat((hex & 0xFF0000) >> 16)/256.0
        let green = CGFloat((hex & 0xFF00) >> 8)/256.0
        let blue  = CGFloat(hex & 0xFF)/256.0
        return UIColor(red: red, green: green, blue: blue, alpha: CGFloat(alpha))
    }
}

Я надеюсь, что ваша помощь решит эту проблему, и надеюсь, что это будет весьма заметно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...