ContentView.swift
//
// ContentView.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct ContentView: View {
@State private var showDetails = false
@State private var selectedItem = dessertData[0]
var body: some View {
NavigationView {
ZStack {
Color("Color")
VStack {
HomeTopBar()
SearchBarView()
ScrollView(.vertical, showsIndicators: false) {
VStack {
ForEach(dessertData, id: \.self) { item in
Button(action: {
showDetails = true
selectedItem = item
}, label: {
DessertItemView(item: item)
})
}
.background(
NavigationLink(
destination: DessertDetails(dessert: selectedItem)
.navigationBarBackButtonHidden(true), isActive: $showDetails) {
EmptyView()
}
)
}
}
Spacer()
}
}
.edgesIgnoringSafeArea(.all)
}
}
}
struct DessertItemView: View {
var item: Dessert
var body: some View {
ZStack(alignment: .topLeading) {
HStack(spacing: 16) {
Image(item.image)
.resizable()
.scaledToFill()
.clipShape(Circle())
.frame(width: 80, height: 80)
VStack(alignment: .leading) {
Text(item.name)
.font(.system(size: 16, weight: .regular))
.padding(.trailing, 20)
.foregroundColor(.gray)
}
Spacer()
Text(item.price)
.font(.system(size: 14, weight: .semibold))
.padding()
.foregroundColor(.green)
}
}
.background(Color.white)
.cornerRadius(40)
.padding(.horizontal, 20)
.padding(.vertical,5)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
HomeTopBar.swift
//
// HomeTopBar.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct HomeTopBar: View {
var height = UIScreen.main.bounds.height
var body: some View {
HStack{
Text("Home")
.fontWeight(.bold)
.frame(alignment: .center)
.navigationBarItems(
leading:
Button(action: {}) {
Image(systemName: "slider.horizontal.3")
.font(.title)
.padding(.horizontal)
}
)
}
.foregroundColor(Color.black)
.padding()
.padding(.top, height < 750 ? 0 : 50)
}
}
struct HomeTopBar_Previews: PreviewProvider {
static var previews: some View {
HomeTopBar()
}
}
SearchBarView.swift
//
// SearchBarView.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct SearchBarView: View {
@State var searchKey: String = ""
var body: some View {
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(.black)
.padding()
TextField("Search ...", text: $searchKey)
}
.background(Color.white)
.cornerRadius(30)
.padding(.horizontal, 25)
.padding(.bottom)
}
}
struct SearchBarView_Previews: PreviewProvider {
static var previews: some View {
SearchBarView()
}
}
DessertDetails.swift
//
// DessertDetails.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct DessertDetails: View {
@Environment(\.presentationMode) var presentationMode
@State var dessert: Dessert = dessertData[2]
var body: some View {
VStack(alignment: .leading) {
Header(image: dessert.image)
VStack(alignment: .leading) {
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .leading) {
Text(dessert.name)
.foregroundColor(.primary)
.font(.title)
.fontWeight(.bold)
.padding(.horizontal)
.padding(.vertical, 10)
HStack {
Text(dessert.price)
.font(.title3)
.fontWeight(.bold)
Spacer()
AmountView()
}
.padding(.horizontal)
HStack {
SubInfoView(image: "car", info: "Free Delivery")
Spacer()
SubInfoView(image: "timer", info: "20min")
}
.padding(.top, 20)
.padding()
Text("Description :")
.fontWeight(.medium)
.padding(.horizontal)
Text(dessert.description)
.foregroundColor(.gray)
.fontWeight(.light)
.padding()
}
}
}
Button(action: {
}) {
Text("Add to Cart")
.foregroundColor(.white)
}
.padding()
.frame(width: UIScreen.main.bounds.width / 1.1)
.background(Color.green)
.cornerRadius(35)
.padding()
Spacer()
}
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)
.toolbar(content: {
ToolbarItem(placement: .navigationBarLeading) {
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Image(systemName: "chevron.backward")
.imageScale(.large)
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
}) {
Image(systemName: "heart")
.imageScale(.large).foregroundColor(.red)
}
}
})
}
}
struct SubInfoView: View {
var image: String
var info: String
var body: some View {
HStack(spacing: 8) {
Image(systemName: image)
Text(info)
}
}
}
struct AmountView: View {
@State var count = 1
var body: some View {
HStack {
Button(action: {
if self.count != 0{
self.count -= 1
}
}) {
Text("-")
.font(.title)
.foregroundColor(.black)
.frame(width: 35, height: 35)
.background(Circle().stroke().foregroundColor(Color.green))
}
Text("\(self.count)")
.font(.title2)
.fontWeight(.bold)
Button(action: {
self.count += 1
}) {
Text("+")
.font(.title)
.foregroundColor(.black)
.frame(width: 35, height: 35)
.background(Circle().stroke().foregroundColor(Color.green))
}
}
}
}
struct Header: View {
var image: String
var body: some View {
ZStack(alignment: .top) {
Image(image)
.resizable()
.scaledToFill()
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 2)
.cornerRadius(45)
}
}
}
struct DessertDetails_Previews: PreviewProvider {
static var previews: some View {
DessertDetails()
}
}
Model.swift
//
// Model.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import Foundation
struct Dessert: Identifiable, Hashable {
public var id: Int
public var image: String
public var name: String
public var price: String
public var description: String
}
var dessertData = [
Dessert(id: 0, image: "desert1", name: "Leche Flan", price: "$2.99", description: "Leche Flan is a dessert made-up of eggs and milk with a soft caramel on top. It resembles crème caramel and caramel custard."),
Dessert(id: 1, image: "desert2", name: "Maja Blanca", price: "$2.02", description: "Maja Blanca is a Filipino dessert made from coconut milk, cornstarch, and sugar. Often called Coconut Pudding, this luscious dessert is easy to make"),
Dessert(id: 2, image: "desert3", name: "Yema", price: "$1.00", description: "Yema is a type of Filipino candy named after the Spanish term for egg yolks. I don't see the reason as to why not because egg yolk is a major ingredient "),
Dessert(id: 3, image: "desert4", name: "Ube Halaya", price: "$3.99", description: "Ube Halaya or is a type of Filipino jam made from purple yam. It's commonly served as a midday snack or after-meal dessert"),
Dessert(id: 4, image: "desert5", name: "Buko Salad", price: "$1.99", description: "The Buko Salad Recipe is prepared with young shredded coconut, canned fruits, cream and sweetened milk. A very popular dessert in every parties or occasion."),
Dessert(id: 5, image: "desert6", name: "Polvoron", price: "$0.99", description: "Polvoron is a type of shortbread popular in Spain and its former colonies in Latin America and the Philippines."),
Dessert(id: 6, image: "desert7", name: "Pastillas", price: "$0.85", description: "Pastillas de leche are sweet milk candies that are usually served for dessert. An authentic recipe will require the use of Carabao's"),
Dessert(id: 7, image: "desert8", name: "Cassava Cake", price: "$1.99", description: "Cassava Cake is a classic Filipino dessert made from grated cassava (manioc). Cassava is also known as kamoteng kahoy and balinghoy"),
]
