ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SwiftUI Sheet 58 - Sheet 크기별로 디스플레이 하기 (1/4, 중간, 전체사이즈)
    SwiftUI 100 레시피/Sheets 2022. 6. 27. 13:16

    #1. ContentView

     

    import SwiftUI

     

    struct ContentView: View {

        

        @State private var sheetMode: SheetMode = .none

        

        var body: some View {

            ZStack{

                FlexibleSheet(sheetMode: $sheetMode){

                        VStack{

                            Text("Hello World")

                                .foregroundColor(.white)

                                .font(.largeTitle)

                        } .frame(maxWidth: .infinity, maxHeight: .infinity)

                            .background(Color.green)

                            .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous))

                }

                

                Button("Show"){

                    

                    switch sheetMode{

                    case .none:

                        sheetMode = .quarter

                    case .quarter:

                        sheetMode = .half

                    case .half:

                        sheetMode = .full

                    case .full:

                        sheetMode = .none

                    }

                } .font(.largeTitle)

            }

        }

    }

     

    struct ContentView_Previews: PreviewProvider {

        static var previews: some View {

            ContentView()

        }

    }

     

    #2. FlexibleSheet

    import SwiftUI

     

    enum SheetMode{

        case none

        case quarter

        case half

        case full

    }

     

    struct FlexibleSheet<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())

                 .animation(.spring(), value: 2)

                .edgesIgnoringSafeArea(.all)

        }

    }

     

    struct FlexibleSheet_Previews: PreviewProvider {

        static var previews: some View {

            FlexibleSheet(sheetMode: .constant(.none)){

                VStack{

                    Text("Hello World")

                } .frame(maxWidth: .infinity, maxHeight: .infinity)

                    .background(Color.blue)

                    .clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous))

            }

        }

    }

     

     

    .none
    .quarter

     

    .half

     

    .full

     

    'SwiftUI 100 레시피 > Sheets' 카테고리의 다른 글

    SwiftUI Sheet 57 - 여러개 Sheet 열기  (0) 2022.06.27
    SwiftUI Sheet 56 - Sheet 열기, 닫기  (0) 2022.06.27

    댓글

Designed by Tistory.