SwiftUI

[SwiftUI]뷰 중첩(겹치기)을 위한 Overlay, Background 예제 (ZStack)

Overlay 와 Background 수식어를 이용하여 ZStack과 동일한 중첩된 뷰를 만들 수 있습니다. Overlay는 중첩방향이 위로 쌓아갑니다.

struct ContentView: View {
    var body: some View {
        Rectangle().fill(Color.green).frame(width: 150, height: 150)
        .overlay( // 초록색 사각형 위로 뷰를 추가
            Rectangle().fill(Color.yellow) // 크기값을 주지 않았음으로 초록색 사각형과 동일한 크기
        )
    }
}

[프리뷰 결과]

초록색 사각형 위로 노란색 사각형이 중첩되어 보여집니다.

Background는 Overlay와 동일하지만 차이점은 중첩방향이 아래방향으로 쌓아 나갑니다.

Background는 배경의 색을 바꿀 때 사용했었지만 실제로는 뷰의 하위 계층에 쌓아가는 것입니다.

struct ContentView: View {
    var body: some View {
        Rectangle().fill(Color.green).frame(width: 150, height: 150)
        .background( // 초록색 사각형 아래로 뷰를 추가
            Rectangle().fill(Color.yellow) // 크기값을 주지 않았음으로 초록색 사각형과 동일한 크기
        )
    }
}

프리뷰를 보면 overlay와는 반대로 초록색 사각형이 보입니다.

노란색 사각형은 초록색 사각형 뒤에 숨어 있습니다.

Alignment 정렬 예제

overlay와 background 수식어의 경우 alignment 매개변수로 뷰의 위치를 설정할 수 있습니다.

//
//  ContentView.swift
//  studySwift


import SwiftUI

struct ContentView: View {
    var body: some View {
        Circle()
            .fill(Color.yellow.opacity(0.8)) // 배경 투명도 설정
            .frame(width: 250, height: 250)
            
            // overlay
            .overlay(Text("조이스틱").font(.largeTitle))
            .overlay(Image(systemName: "arrow.up").font(.title).padding(), alignment:.top)
        
            .overlay(Image(systemName: "arrow.left").font(.title).padding(), alignment:.leading)
        
            .overlay(Image(systemName: "arrow.up.right.circle.fill").font(.title).padding(), alignment:.topTrailing)
        
            .background(Image(systemName: "arrow.down").font(.title).padding(), alignment: .bottom)
        
            .background(Image(systemName: "arrow.right").font(.title).padding(), alignment: .trailing)
        
        
    }
}

                    
//            Button(action: {
//
//            }){
//                Image(systemName: "trash.circle.fill")
//            }
            
            
//            Image(systemName: "trash.slash.circle")
//                .symbolRenderingMode(.monochrome)
//                .foregroundStyle(.red, .yellow, .green)
//                .font(.system(size: 100))
//
//            Image(systemName: "trash.slash.circle")
//                .symbolRenderingMode(.hierarchical)
//                .foregroundStyle(.red, .yellow, .green)
//                .font(.system(size: 100))
//                .frame(width: 300, height: 300, alignment: .center)
//                .background(.gray)
            
//            Image(systemName: "trash.slash.circle")
//                .symbolRenderingMode(.palette)
//                .foregroundStyle(.red, .yellow, .green)
//                .font(.system(size: 100))
//
//            Image(systemName: "trash.slash.circle")
//                .symbolRenderingMode(.multicolor)
//                .foregroundStyle(.red, .blue, .green)
//                .font(.system(size: 100))

            
//            //렌더링 모드 생략시 시스템이 결정
//            Image("squid-game")
//
//            // 원본 이미지 유지
//            Image("squid-game")
//                .renderingMode(.original)
//
//            // 템플릿 적용
//            Image("squid-game")
//                .renderingMode(.template)
//        }
//    }
//
//}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
//.previewInterfaceOrientation(.landscapeLeft)›
    }
}

[프리뷰]

overlay 수식어로 추가한 화살표는 진하게 표기되었습니다.

아래코드는 ZStack을 사용하여 위의 조이스틱 UI와 동일한 레이아웃 UI를 구현한 예제 코드 입니다.

내부적으로 뷰를 그리는 방식은 다릅니다.

//
//  ContentView.swift
//  studySwift
 

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            VStack {
                Spacer()
                Image(systemName: "arrow.down").font(.title).padding()
            }
        
            HStack {
                Spacer()
                Image(systemName: "arrow.right").font(.title).padding()
            }
            Circle()
                .fill(Color.yellow.opacity(0.8))
                .frame(width: 250, height: 250)
            
            Text("조이스틱").font(.largeTitle)
            
            ZStack(alignment: .topTrailing) {
                Color.clear
                Image(systemName: "arrow.up.right.circle.fill").font(.title)
            }
            
            VStack {
                Image(systemName: "arrow.up").font(.title).padding()
                Spacer()
            }
            
            HStack {
                Image(systemName: "arrow.left").font(.title).padding()
                Spacer()
            }
        
        }.frame(width:250, height:250)
    }
}
    
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
//.previewInterfaceOrientation(.landscapeLeft)›
    }
}

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

Leave a Reply

error: Content is protected !!