IOS개발: SWIFT/6. Swift UI로 UI 개발하기

SwiftUI 레이아웃: Spacer, GeometryReader

_Blue_Sky_ 2024. 9. 14. 14:39
728x90
728x90

SwiftUI 레이아웃: Spacer와 GeometryReader를 활용한 유연한 UI 디자인

SwiftUI에서 레이아웃을 구성할 때 Spacer와 GeometryReader는 매우 유용한 도구입니다. 각각의 역할과 사용법을 자세히 알아보고, 다양한 예시를 통해 이해를 돕겠습니다.

Spacer: 간격 조절의 마법사

Spacer는 View 사이에 간격을 조절하여 원하는 레이아웃을 구성하는 데 사용됩니다. 특히 Stack(HStack, VStack, ZStack) 내에서 자주 활용됩니다.

  • 기본 사용법:위 코드는 "Hello"와 "World" 라는 텍스트를 가로로 배치하고, 두 텍스트 사이에 Spacer를 넣어 남은 공간을 채웁니다. 즉, "World"가 오른쪽 끝에 위치하게 됩니다.
    HStack {
        Text("Hello")
        Spacer()
        Text("World")
    }
    
     
  • 가변적인 간격: Spacer는 .frame(minWidth: , maxWidth: , minHeight: , maxHeight: ) modifier를 사용하여 최소/최대 크기를 지정할 수 있습니다. 이를 통해 더욱 유연한 레이아웃을 구성할 수 있습니다.
  • 다양한 활용:
    • 균등 분배: 여러 개의 View 사이에 Spacer를 넣어 공간을 균등하게 분배할 수 있습니다.
    • 여백 생성: 특정 View 주변에 여백을 생성할 수 있습니다.
    • 응답형 디자인: 디바이스 크기에 따라 레이아웃을 자동으로 조절할 수 있습니다.

GeometryReader: View의 크기와 위치를 활용한 정교한 레이아웃

GeometryReader는 부모 View의 크기와 위치 정보를 얻어 자식 View의 레이아웃을 동적으로 조절하는 데 사용됩니다.

  • 기본 사용법:위 코드는 부모 View의 절반 크기의 파란색 사각형을 생성합니다. geometry.size.width와 geometry.size.height를 통해 부모 View의 크기를 얻어 자식 View의 크기를 조절할 수 있습니다.
    GeometryReader { geometry in
        Rectangle()
            .fill(Color.blue)
            .frame(width: geometry.size.width * 0.5, height: geometry.size.height * 0.5)
    }
    
     
  • 다양한 활용:
    • 응답형 디자인: 디바이스 크기에 따라 레이아웃을 자동으로 조절하여 다양한 화면 크기에 최적화된 UI를 구현할 수 있습니다.
    • 동적 레이아웃: 사용자의 상호 작용에 따라 레이아웃을 변경할 수 있습니다.
    • 복잡한 레이아웃: 여러 개의 GeometryReader를 조합하여 복잡하고 정교한 레이아웃을 구현할 수 있습니다.

Spacer와 GeometryReader를 함께 사용하는 예시

  • 가변적인 카드 레이아웃:위 코드는 가변적인 개수의 카드를 가로로 배치하고, 각 카드가 남은 공간을 균등하게 차지하도록 합니다.
    HStack {
        ForEach(0..<5) { index in
            VStack {
                Image(systemName: "circle.fill")
                    .resizable()
                    .frame(width: 50, height: 50)
                Text("Card \(index + 1)")
            }
            .frame(maxWidth: .infinity) // 각 카드가 남은 공간을 채우도록 설정
            Spacer()
        }
    }
    
     
  • Custom Progress Bar:위 코드는 GeometryReader를 사용하여 부모 View의 크기에 맞춰 Progress Bar를 생성하고, progress 값에 따라 파란색 부분의 길이를 조절합니다.
     
    GeometryReader { geometry in
        ZStack(alignment: .leading) {
            Rectangle()
                .fill(Color.gray)
            Rectangle()
                .fill(Color.blue)
                .frame(width: geometry.size.width * progress) // progress 값에 따라 길이가 변하는 파란색 부분
        }
    }
    
     

결론

Spacer와 GeometryReader는 SwiftUI에서 레이아웃을 구성하는 데 매우 유용한 도구입니다. Spacer는 간단한 간격 조절을, GeometryReader는 더욱 정교한 레이아웃을 구현하는 데 사용할 수 있습니다. 두 가지를 효과적으로 활용하여 다양하고 유연한 UI를 디자인해 보세요.

728x90
728x90