SwiftUI 튜토리얼(3)

유재우·2022년 5월 17일
0

SwiftUI 튜토리얼

목록 보기
3/8

@Binding

  • 뷰와 뷰 사이의 데이터를 연동시킨다
struct MyVStackView: View {
    @Binding // 데이터를 연동시킨다
    var isActived: Bool
    init(isActived: Binding<Bool> = // 생성자
        .constant(false)) { // 기본값을 false로 설정
            _isActived = isActived
        }
    var body: some View {
        VStack{ // Vertical Stack으로 수직으로 쌓는다.
            Text("1!")
                .fontWeight(.bold) // 1!! 텍스트를 굵게 설정
                .font(.system(size: 40)) // 텍스트사이즈를 60으로 설정
                .padding()
            Text("2!")
                .fontWeight(.bold) // 2!! 텍스트를 굵게 설정
                .font(.system(size: 40))
                .padding()
            Text("3!")
                .fontWeight(.bold) // 3!! 텍스트를 굵게 설정
                .font(.system(size: 40))
                .padding()
        } // VStack
        .background(self.isActived ? Color.green : Color.red) // isActived가 true이면 VStack의 배경색을 초록색으로 하고 false이면 빨강색으로 지정
        .padding(self.isActived ? 10 : 0)
    }
}
  • MyVStackView
  • ContentView
struct ContentView: View { // View
    @State  // 값의 변화를 감지 -> 뷰에 적용
    private var isActived: Bool = false
    var body: some View {
        NavigationView{
            VStack{
                HStack{
                    // HStack안에 VStack을 3개 넣음
                    MyVStackView(isActived: $isActived) // ContentView의 isActived를 MyVStackView의 isActived로 연결
                    MyVStackView(isActived: $isActived)
                    MyVStackView(isActived: $isActived)
                } // HStack
                .padding(isActived ? 50 : 10)
                .background(isActived ? Color.yellow : Color.black) // isActived가 만약 True일 땐 배경이 파란색이고 아닐 때엔 검은색으로 설정
                .onTapGesture { // 탭 제스쳐 추가
                    print("HStack이 클릭됨")
                    withAnimation { // 애니메이션 효과 적용
                        self.isActived.toggle() // toggle() = isActived 가 True 이면 False로 False이면 True로 변경
                    }
                }
                NavigationLink(destination: MyTextView() ){ // NavigationLink를 클릭하면 MyTextView()View로 넘어간다.
                    Text("네비게이션") // 네비게이션링크에 대한 설정
                        .fontWeight(.heavy)
                        .font(.system(size: 40))
                        .padding()
                        .background(Color.orange)
                        .foregroundColor(Color.white)
                        .cornerRadius(30)
                }
                .padding(.top, 50)
            } // VStack
        } // NavigationView
    }
}


struct MyTextView: View {
    @Binding // 데이터를 연동시킨다
    var isActived: Bool
    init(isActived: Binding<Bool> = // 생성자
        .constant(false)) { // 기본값을 false로 설정
            _isActived = isActived
        }
    @State  // 값의 변화를 감지 -> 뷰에 적용
    private var index: Int = 0
    private let backgroundColors = [ // 배경색 배열
        Color.red,
        Color.yellow,
        Color.blue,
        Color.green,
        Color.orange
    ]
    var body : some View {
        VStack{
            Spacer() // Text("배경 아이템 인덱스") 위에 공간을 채워준다.
            Text("배경 아이템 인덱스 \(self.index)")
                .font(.system(size: 30))
                .fontWeight(.bold)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 100) // frame으로 꽉채운다.
            Text("활성화 상태: \(String(isActived))")
                .font(.system(size: 30))
                .fontWeight(.bold)
                .foregroundColor(self.isActived ? Color.yellow : Color.gray) // isActived가 true이면 Text의 폰트색을 노란색으로 하고 false이면 회색으로 지정
                .background(Color.black)
            Spacer() // Text("배경 아이템 인덱스") 아래의 공간을 채워준다.
        }
        .background(backgroundColors[index]) // background의 색을 backgroundColors 배열 안에 있는 색으로 지정
        .onTapGesture {
            print("배경아이템이 클릭됨")
            if(self.index == self.backgroundColors.count - 1){ // self.index가 backgroundColors의 마지막 인덱스를 지칭하면 0으로 초기화
                self.index = 0
            } else {
                self.index += 1
            }
        }
    }
}
  • MyTextView
profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글