[swiftUI] - Stack과 Frame

Jenny·2024년 2월 27일

SwiftUI 동적 HStack과 VStack 변환

  • SwiftUI는 레이아웃에 사용되는 스택 타입을 앱 코드 내에서 동적으로 변경할 수 있게한다.
  • AnyLayout 인스턴스를 생성하고 HStackLayout, VStackLayout 컨테이너에 할당하여 동적으로 변환 할 수 있다.
@State var myLayout: AnyLayout = AnyLayout(VStackLayout())

    var body: some View {
        VStack {
            myLayout {
                Image(systemName: "goforward.10")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                Image(systemName: "goforward.15")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
            }
            
            HStack {
                Button(action: {
                    myLayout = AnyLayout(HStackLayout()) }) {
                        Text("HStack")
                    }
                Button(action: {
                    myLayout = AnyLayout(VStackLayout()) }) {
                        Text("VStack")
                    }
            }
        }
    }

SwiftUI 텍스트 줄 제한, 레이아웃 우선순위

  • 스택의 크기자 제한되어 있거나, 다른 뷰들과 공간을 나눠서 사용해야 하는 상황처럼, 스택이 충분한 공간을 가지고 있지 않다면 텍스트는 자동으로 여러 줄로 표시된다.
  • 만약 해당 스택 내부에 텍스트가 한줄로만 표시 되어야 하거나 줄의 제한을 걸어둬야 할 경우 numberofLines를 해야 할 경우 lineLimit() 수정자를 사용하면 된다.
  • KeyPoint : 많은 수의 자식 뷰로 인한 성는 문제가 발생할 때는 지연(lazy) 스택 뷰를 전환 하는 것이 좋고 그것이 아니면 일반 스택뷰로 선언하여 구현하는 것이 좋다.

SwiftUI Frame

  • 기본적으로 뷰는 자신의 콘텐츠와 지신이 속한 레이아웃에 따라 자동으로 크기가 조절된다.
  • 대부분은 뷰의 크기와 위치는 스택 레이아웃을 사용하여 조절할 수 있지만 Frame 수정자를 통해 뷰 자체 특정 크기나 영역에 맞게 지정할 수 있다.
  • Frame 수정자를 사용할 경우 뷰의 크기나, 영역은 동적으로 변하지 않는다.
  • frame 수정자는 safe-area 를 준수한다. 안전 영역 밖으로 확장 되도록 frame을 구성하려면 edgesIgnoringSafeArea() 수정자를 사용하면 된다.

SwiftUI GeometryReader

  • Frame은 뷰들을 담고 있는 컨테이너의 크기에 따라 조절 되도록 할 수 있다 즉 (self.view.frame.size.width) 처럼
  • 이 작업은 GeometryReader 로 뷰를 감싸고 컨테이너의 크기를 식별하기 위한 reader를 이용하여 할 수 있다.
        GeometryReader { geometry in
            VStack {
                Text("Hello World, how are you!")
                    .font(.largeTitle)
                    .frame(width: geometry.size.width / 2, height: (geometry.size.height / 4) * 3)
                Text("Goodbye World")
                    .font(.largeTitle)
                    .frame(width: geometry.size.width / 3, height: geometry.size.height / 4)
            }
        }
profile
"Jenny 있게 iOS 개발을 하며 대체 불가능한 인재가 되자"

0개의 댓글