SwiftUI

[SwiftUI] 레이아웃 배치 스택(HStack,VStack,ZStack) 기본 사용 방법 (뷰 정렬 방법 및 뷰들 사이의 간격 조정 방법)

SwiftUI에서 레이아웃을 구성할 때  Stack은 필수적으로 활용하게되는 매우 중요한 뷰 레이아웃입니다.

스택의 3가지 종류

스택 설명
HStack 가로방향으로 뷰를 배열(Horizontal Stack)
VStack 세로방향으로 뷰를 배열(Vertical Stack)
ZStack 뷰를 겹겹이 쌓아 올리는 형태로 배열(Depth Stack)

1. 가로방향 뷰 배열 HStack 예제

import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack {
            Rectangle()
                .fill(Color.red)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 150, height: 150)
        }
    }
        
}

<HStack 프리뷰 결과>

2. 세로방향 뷰 배열 VStack 예제

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Rectangle()
                .fill(Color.red)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 150, height: 150)
        }
    }
        
}

<VStack 프리뷰 결과>

3.뷰를 겹겹이 쌓아 올리는 형태로 배열(Depth Stack) 예제

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.red)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 150, height: 150)
        }
    }
        
}

<ZStack 프리뷰 결과>

ZStack의 경우 겹겹히 쌓여있기 때문에 최상단의 노란색 사각형만 보여집니다.

빨간색과 파란색 사각형은 뒤쪽 덮여 있기때문에 보이지 않습니다.

offset()수식어를 사용하여 x축과 y축 좌표를 지정한 수치만큼 이동  후 확인가능합니다.

struct ContentView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.red)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 150)
                .offset(x: 30, y: 30)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 150, height: 150)
                .offset(x: 60, y: 60)
        }
    }
        
}

<ZStack offset 적용 프리뷰 결과>

<ZStack 뷰 계층 구조>

뷰 사이의 간격 및 정렬 방법

기본정렬값으로 가운데 정렬이 적용되며, 자식 뷰 간에 간격을 지정하는 spacing 역시 기본값이 적용됩니다.

위 예제에서 사각형의 높이값을 변경하여 정렬의 변화를 살펴보면 다음과 같습니다.

struct ContentView: View {
    var body: some View {
        HStack(alignment: .top, spacing: 0) {
            Rectangle()
                .fill(Color.red)
                .frame(width: 150, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 200)
            
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 150, height: 250)
        }
    }
        
}

<HStack(alignment: .top, spacing: 0) 프리뷰 결과>

뷰 간의 간격을 0 값을 주고 정렬방향을 top 값을 준 결과입니다.

정렬값으로 .bottom과 .center값을 적용해서 확인해보세요.

스택은 뷰 컨테이너이자 하나의 뷰이기 때문에 수식어를 적용할 수 있습니다. 다음 예제는 테두리와 패딩을 적용한 예제입니다.

padding을 먼저 적용하느냐? 테두리 border를 먼저 적용하느냐에 따라 결과가 달라집니다. 수식어 순서에 항상 유의해야합니다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack(alignment: .bottom, spacing: 10) {
            Rectangle()
                .fill(Color.red)
                .frame(width: 100, height: 150)
            
            Rectangle()
                .fill(Color.blue)
                .frame(width: 100, height: 200)
            
            Text("안녕하세요.").font(.title)
            Text("안녕하세요.")
        }
        
        .padding()
        .border(Color.green)
        .font(.largeTitle)
    }
        
}

녹색 테두리가 다른 뷰와 붙지 않고 여백이 처리된 결과입니다.

.font 수식어를 사용하면 HStack 안의 자식 뷰들의 글자 폰트 크기를 일괄적으로 변경할 수도 있습니다.

단 예외로, 자식뷰 중에  첫번째 문자열인 “안녕하세요”의 경우 font를 이미 적용한 경우에는 예외가 되어 적용되지않습니다.

위 포스팅 내용들은 “스윗한 SwiftUI(이봉원 지음)” 전자책을 보고 스터디 및 실습한 내용들을 기록하였습니다.

Leave a Reply

error: Content is protected !!