ContentView.swift
// // ContentView.swift // swiftuidev15ios // // Created by Cairocoders // import SwiftUI struct ContentView: View { @State private var sheetMode: SheetMode = .none var body: some View { ZStack { SheetView(sheetMode: $sheetMode) { if sheetMode == .quarter { VStack { Text("Hello World! Sheets in SwiftUI") .font(.body).foregroundColor(.white) Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.yellow) .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous)) }else if sheetMode == .half { VStack { Text("Hello World! Sheets in SwiftUI") .foregroundColor(.white) Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.green) .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous)) }else if sheetMode == .full { VStack { Text("Hello World! Sheets in SwiftUI") .foregroundColor(.white) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.orange) .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous)) }else { VStack { Text("Hello World! Sheets in SwiftUI") .foregroundColor(.white) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red) .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous)) } } VStack { Button(action: { sheetMode = .quarter }) { HStack { Text("Show Quater") .font(.system(size: 18)) .fontWeight(.bold) } .frame(width: 200) .padding() .foregroundColor(.white) .background(Color.yellow) .cornerRadius(40) } Button(action: { sheetMode = .half }) { HStack { Text("Show half") .font(.system(size: 18)) .fontWeight(.bold) } .frame(width: 200) .padding() .foregroundColor(.white) .background(Color.green) .cornerRadius(40) } Button(action: { sheetMode = .full }) { HStack { Text("Show full") .font(.system(size: 18)) .fontWeight(.bold) } .frame(width: 200) .padding() .foregroundColor(.white) .background(Color.orange) .cornerRadius(40) } Button(action: { sheetMode = .none }) { HStack { Text("Show none") .font(.system(size: 18)) .fontWeight(.bold) } .frame(width: 200) .padding() .foregroundColor(.white) .background(Color.red) .cornerRadius(40) } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }SheetView.swift
// // SheetView.swift // swiftuidev15ios // // Created by Cairocoders // import SwiftUI struct SheetView<Content: View>: View { let content: () -> Content var sheetMode: Binding<SheetMode> init(sheetMode: Binding<SheetMode>, @ViewBuilder content: @escaping () -> Content) { self.content = content self.sheetMode = sheetMode } private func calculateOffset() -> CGFloat { switch sheetMode.wrappedValue { case .none: return UIScreen.main.bounds.height case .quarter: return UIScreen.main.bounds.height - 200 case .half: return UIScreen.main.bounds.height/2 case .full: return 0 } } var body: some View { content() .offset(y: calculateOffset()) .animation(.spring()) .edgesIgnoringSafeArea(.all) } } struct SheetView_Previews: PreviewProvider { static var previews: some View { SheetView(sheetMode: .constant(.none)) { VStack { Text("Hello World") }.frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.blue) .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous)) } } } enum SheetMode { case none case quarter case half case full }