[SwiftUI] 7. View Layout: 스택을 사용한 컨텐츠 구성 및 정렬

Sean·2023년 5월 3일
0

SwiftUI_튜토리얼

목록 보기
7/11

참고 자료: SwiftUI 튜토리얼 공식문서

이제 막 SwiftUI를 배워보는 한 사람으로서, 코드 작성하고 내가 이해 한 대로 작성할것이다.

이 글의 내용은 위에 있는 참고자료의 공식문서를 번역하여 조금 더 내가 느끼기에 자연스럽게 만들어서 작성하는것이다.

누군가에게 알려주기보다 자신이 정리를 하면서 다시 문서를 보고 어버버거리지 않게 다시 참고하기 위함이기에 해당 문서를 읽는 사람은 swift에 대해서 어느 정도 안다는 가정하에 글을 작성할것이다

시작

스택을 사용하여 데이터 및 환경 변화에 적응하는 정렬을 만든다.
텍스트와 이미지를 포함하는 변경 가능한 데이터 소스에서 얻은 정보를 전달해야 할 때 적응할 수 있는 방식으로 컨텐츠를 정렬하는것이 중요하다.

분석

1. view model로 관련된 데이터 관리

소스코드

EventTile.swift

import SwiftUI

struct Event {
    let title: String
    let date: Date
    let location: String
    let symbol: String
}

struct EventTile: View {
    let event: Event
    let stripeHeight = 15.0
    var body: some View {
        HStack(alignment: .firstTextBaseline) {
            Image(systemName: event.symbol)
                .font(.title)
            VStack(alignment: .leading) {
                Text(event.title)
                    .font(.title)
                Text(
                    event.date,
                    format: Date.FormatStyle()
                        .day(.defaultDigits)
                        .month(.wide)
                )
                Text(event.location)
            }
        }
        .padding()
        .padding(.top, stripeHeight)
        .background {
            ZStack(alignment: .top) {
                Rectangle()
                    .opacity(0.3)
                Rectangle()
                    .frame(maxHeight: stripeHeight)
            }
            .foregroundColor(.teal)
        }
        .clipShape(RoundedRectangle(cornerRadius: stripeHeight, style: .continuous))
    }
}

struct EventTile_Previews: PreviewProvider {
    static let event = Event(title: "Buy Daisies", date: .now, location: "Flower Shop", symbol: "gift")
    
    static var previews: some View {
        EventTile(event: event)
    }
}

view를 정의하는 첫번째 단계는 view에 표시되는 데이터를 식별하는 것이다.
view 레이아웃은 이벤트의 이름, 날짜 및 위치를 포함하여 예정된 이벤트의 세부 정보를 표시한다.
또한 이벤트 유형을 나타내는 아이콘도 포함되어있다.
관련 데이터를 view model로 구성하기 위해서 커스텀한 구조체를 정의했다.

샘플코드에서 Event 구조체는 이벤트에 대한 모든 데이터를 정의한다.
EventTile 구조체에서 특정 인스턴스에 대한 모든 데이터를 가져온다.
그리고 해당 데이터를 뿌려주고 UI를 그려준다.

2. 중첩 스택으로 view 정의

소스코드
import SwiftUI

struct Event {
    let title: String
    let date: Date
    let location: String
    let symbol: String
}

struct EventTile: View {
    let event: Event
    let stripeHeight = 15.0
    var body: some View {
        HStack(alignment: .firstTextBaseline) {
            Image(systemName: event.symbol)
                .font(.title)
            VStack(alignment: .leading) {
                Text(event.title)
                    .font(.title)
                Text(
                    event.date,
                    format: Date.FormatStyle()
                        .day(.defaultDigits)
                        .month(.wide)
                )
                Text(event.location)
            }
        }
        .padding()
        .padding(.top, stripeHeight)
        .background {
            ZStack(alignment: .top) {
                Rectangle()
                    .opacity(0.3)
                Rectangle()
                    .frame(maxHeight: stripeHeight)
            }
            .foregroundColor(.teal)
        }
        .clipShape(RoundedRectangle(cornerRadius: stripeHeight, style: .continuous))
    }
}

struct EventTile_Previews: PreviewProvider {
    static let event = Event(title: "Buy Daisies", date: .now, location: "Flower Shop", symbol: "gift")
    
    static var previews: some View {
        EventTile(event: event)
    }
}

데이터 모델을 정의한 후 view를 만들어 해당 데이터를 표시하고 스택 및 맞춤으로 해당 보기를 구성한다.
HStack > VStack 으로 연달아 중첩으로 스택을 구성

3. 레이어 모양으로 배경 추가

소스코드
import SwiftUI

struct Event {
    let title: String
    let date: Date
    let location: String
    let symbol: String
}

struct EventTile: View {
    let event: Event
    let stripeHeight = 15.0
    var body: some View {
        HStack(alignment: .firstTextBaseline) {
            Image(systemName: event.symbol)
                .font(.title)
            VStack(alignment: .leading) {
                Text(event.title)
                    .font(.title)
                Text(
                    event.date,
                    format: Date.FormatStyle()
                        .day(.defaultDigits)
                        .month(.wide)
                )
                Text(event.location)
            }
        }
        .padding()
        .padding(.top, stripeHeight)
        .background {
            ZStack(alignment: .top) {
                Rectangle()
                    .opacity(0.3)
                Rectangle()
                    .frame(maxHeight: stripeHeight)
            }
            .foregroundColor(.teal)
        }
        .clipShape(RoundedRectangle(cornerRadius: stripeHeight, style: .continuous))
    }
}

struct EventTile_Previews: PreviewProvider {
    static let event = Event(title: "Buy Daisies", date: .now, location: "Flower Shop", symbol: "gift")
    
    static var previews: some View {
        EventTile(event: event)
    }
}

정보가 단일 이벤트를 나타낸다는 것을 나타내기 위해 백그라운드 수정자는 shape view의 ZStack을 포함합니다.
기본 view에 표시되는 정보의 크기에 맞게 조정되는 백그라운드를 정의한다.

참고자료

기타

당연 틀린 부분 지적은 감사하나 비난은 정중하게 사양하겠다.

  • 이건 그냥 코드 한 번 슥 따라 해보고 아 그런거구나 하면 될 부분이라 뭐 딱히 코멘트를 단다거나 풀어쓸 내용이 없다.
profile
"잘 할 수 있을까?"를 고민하기보단 재밌어 보이는건 일단 하고, 잘하기 위해 그냥 계속합니다.

0개의 댓글