Tunko Development Diary

[SwiftUI] List - Header, Footer 추가하기 본문

Development/iOS 개발

[SwiftUI] List - Header, Footer 추가하기

Tunko 2021. 2. 26. 15:21

List 의 Header, Footer 는 Section 안에 담긴다.
기존 UIKit 에서 사용하던 UITableView 내에서도 Cell 이 추가 될떄도 0 번쨰 인덱스 Section 안에 추가 된 형태이다.

하지만 SwiftUI에서의 차이점이라면 굳이 Cell이 섹션안에 있지 않고도 추가 된다는 점이다.

아래 코드는 List 정리 (1)에서 가져온 코드이다.

struct ContentView: View {
    var body : some View {
        List {
            Test("text1")
            Test("text2")
            Test("text3")
            Test("text4")
            Test("text5")
        }
    }
}

지금까지 리스트에는 Section 을 추가 하지 않았다.
하지만 Header, Footer 를 적용하기 위해선 List 내부에 Section을 적용시켜야 한다.

var body: some View {
    VStack {
        List {   
            Section(header: Text("Header"), footer: Text("Footer")) {
                ForEach(0..<5) { index in
                    Text("\(index) : Text")
                }
            }
        }
    }
}

마지막으로 Header 나 Footer 는 정말 많이 활용되기에 커스텀해서 조금 꾸며 보았다.

Section(header: ListHeader(), footer: ListFooter()) { 
    ForEach(0..<5) { index in
        Text("\(index) : Text")
    }
}

해더뷰와 푸터뷰를 따로 정의했다.

struct ListHeader: View {
    var body: some View {
        VStack(alignment: .center) {
            HStack(alignment: .center)
            {
                Image(systemName: "person.circle")
                    .resizable()
                    .offset(y: 3)
                    .frame(width: 56, height: 56, alignment: .center)
                VStack (alignment: .leading)
                {
                    HStack {
                        Text("NickName")
                            .padding(.top)
                            .padding(.leading)
                        Spacer()
                        Image(systemName: "text.justify")
                    }
                    Text("yyyy-mm-dd")
                        .padding(.leading)
                    Spacer()
                    HStack()
                    {
                        Stars(3)
                        Spacer()

                    }.padding(.leading)
                }

            }
        }
            .padding(0)
            .frame(height: 100)
    }
}

struct ListFooter: View {
    var body: some View {
        HStack(alignment: .center) {
            Spacer()
            Text("Footer").font(.title3)
            Spacer()
        }
    }
}

struct Stars: View {
    var score: Int = 0

    init(_ score: Int)
    {
        self.score = score
    }

    var body: some View {
        HStack()
        {
            ForEach(0..<5) { index in
                if index < score {
                    Image(systemName: "star.fill")
                        .resizable()
                        .frame(width: 20, height: 20, alignment: .center)
                        .padding(.bottom)
                } else {
                    Image(systemName: "star")
                        .resizable()
                        .frame(width: 20, height: 20, alignment: .center)
                        .padding(.bottom)
                }
            }
        }
    }
}

반응형
Comments