ContentView.swift
// // ContentView.swift // SwiftUIProject // // Created by Cairocoders // import SwiftUI struct ContentView: View { @State var selection = 1 var body: some View { VStack { ZStack(alignment: .bottomTrailing) { Image("coffee").resizable().frame(height: 350) HStack(spacing: 15){ Text("Kapeng Barako") .foregroundColor(.white) }.padding() } Text("Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit") DropdownPicker(title: "Size", selection: $selection, options: ["Small", "Medium", "Large", "X-Large"]) Button("Place Order") { } .foregroundColor(.white) .frame(width: 300, height: 50) .background(Color.orange) .cornerRadius(10) Spacer() }.padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } struct DropdownPicker: View { var title: String @Binding var selection: Int var options: [String] @State private var showOptions: Bool = false var body: some View { ZStack { // current selection HStack { Text(title) Spacer() Text(options[selection]) .foregroundColor(Color.black.opacity(0.6)) Image(systemName: "chevron.right") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 10, height: 10) } .font(Font.custom("Avenir Next", size: 16).weight(.medium)) .padding(.horizontal, 12) .padding(.vertical, 8) .background(Color.white) .onTapGesture { // show the dropdown options withAnimation(Animation.spring().speed(2)) { showOptions = true } } // Drop down options if showOptions { VStack(alignment: .leading, spacing: 4) { Text(title) .font(Font.custom("Avenir Next", size: 16).weight(.semibold)) .foregroundColor(.white) HStack { Spacer() ForEach(options.indices, id: \.self) { i in if i == selection { Text(options[i]) .font(.system(size: 12)) .padding(.vertical, 8) .padding(.horizontal, 12) .background(Color.white.opacity(0.2)) .cornerRadius(4) .onTapGesture { // hide dropdown options - user selection didn't change withAnimation(Animation.spring().speed(2)) { showOptions = false } } } else { Text(options[i]) .font(.system(size: 12)) .onTapGesture { // update user selection and close options dropdown withAnimation(Animation.spring().speed(2)) { selection = i showOptions = false } } } Spacer() } } .padding(.vertical, 2) .transition(AnyTransition.move(edge: .top).combined(with: .opacity)) } .padding(.horizontal, 12) .padding(.vertical, 8) .background(Color.black) .foregroundColor(.white) .transition(.opacity) } } } }