Topic:
- ์ปค์คํ
ํ์
์ ๋์ธ ๋ ์ ๋๋ฉ์ด์
ํจ๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์ฃผ๊ธฐ
---> SwiftUI์์ fullScreen์ผ๋ก ํ๋ฉด์ ํ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ์ ํ์ ์ ์ด์๊ณ , UIKit์์ ์๋ ๋๋ ๊ฑธ ๋ฆฌํฉํ ๋ง ํ ๋ ๋๊ฐ์ด ๊ตฌํํด์ผ ํ๊ธฐ์ ํ๋ฉด์ ํ์ ํ ๋ fullScreen์ ์ฐ์ง ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํ๋ค.
์ ๊ทผ:
1. ZStack์ ํ์ฉํด์ ๋ทฐ ์์ ๋ทฐ๋ฅผ ๋์ฐ์! ๊ฐ ์ด๋ฒ ์ด์ ํด๊ฒฐ์ ๊ทผ์ ์ ๋ถ๋ค.
*** ์ด ํฌ์คํธ๋ฅผ ์ํด ์์ฑํ ์ฝ๋๋ค์ ํ๋ฉด์ ํ์ ์ค์ ์ผ๋ก ์ง ์ฝ๋์ด๊ธฐ์ UI๋ ๊ณ ๋ คํ์ง ์์๋ค. (์ฆ, UI ๋ ์ด์์ ์ก์ ์ฝ๋๋ ์ชผ๊ธ... ๋๋ฝ๋ค.)
1-1. ์ ZStack์ ์ฐ๊ณ ์ ํ๋ - ํ๋ฉด, ZStack์ ๋ํ ์ ์๊ฐ ํ์ํ๋ค.
A view that overlays its subviews, aligning them in both axes. (...) The ZStack assigns each successive subview a higher z-axis value than the one before it, meaning later subviews appear โon topโ of earlier ones.
๋ผ๊ณ ์ ํ ๊ณต์๋ฌธ์๊ฐ ์ค๋ช ํด์ฃผ๊ณ ์๋๋ฐ, ZStack์ ํน์ง์ ๋ฆ์ ์๋ฒ๋๋ก ๋ทฐ์ ์๋จ์ ์์ธ๋ค๋ ๊ฑฐ๋ค. ๊ทธ๋ฌ๋๊น, ๊ฐ์ฅ ๋ง์ง๋ง ์๋ฒ์ธ ๋ทฐ๊ฐ ๊ฐ์ฅ ์ต์๋จ์ ๋ณด์ฌ์ง๋ค.
<ํ์
View>
import SwiftUI
struct CustomPopUpView: View {
// MARK: - properites
// ํด๋น ํ๋กํผํฐ๋ก ํ์
์ ๋์ธ์ง ๋ง์ง๋ฅผ ๋ถ๋ชจ๋ทฐ์ state ๊ฐ์ผ๋ก ์ ๋ฌ ๋ฐ์ ์์
@Binding var showPopUp: Bool
let title: String // ๊ณต์ง ์ด๋ฆ
let message: String // ๊ณต์ง ๋ด์ฉ
let btn1: String // ์ผ์ชฝ ๋ฒํผ text
let btn2: String // ์ค๋ฅธ์ชฝ ๋ฒํผ text
// MARK: - body
var body: some View {
ZStack {
/// Background - ํ์
์ ๋์ธ ๋ ํ์
์ธ ๋ฐฐ๊ฒฝ์ ์ด๋ก๊ฒ ํ๊ณ ์ ํ๋ค
Rectangle()
.background(.black)
.opacity(0.2)
VStack(spacing: 12) {
Text(title)
.frame(height: 30)
.fontWeight(.bold)
.padding(.top, 12)
Divider()
Text(message)
.multilineTextAlignment(.center)
.padding(.vertical, 12)
HStack(spacing: 8) {
Button(action: {
print("ํ์ธ ๋๋ฆ")
}, label: {
Text(btn1)
.fontWeight(.semibold)
.foregroundStyle(.white)
.padding(.vertical, 8)
.frame(width: 100)
})
.background(
/// ๋ฒํผ ํ
๋๋ฆฌ
RoundedRectangle(cornerRadius: 8)
.foregroundStyle(.brown)
)
Button(action: {
print("์ทจ์ ๋๋ฆ")
showPopUp = false
}, label: {
Text(btn2)
.foregroundStyle(.gray)
.padding(.vertical, 8)
.frame(width: 100)
})
.background(
/// ๋ฒํผ ํ
๋๋ฆฌ
RoundedRectangle(cornerRadius: 8)
.stroke(.gray, lineWidth: 1)
)
}
.frame(height: 44)
.padding(.bottom, 12)
}
.background(.white)
.roundedCorner(16, corners: .allCorners)
.padding(.horizontal, 20)
}
// ZStack์ ํ๋ฉด์ ๊ฝ ์ฑ์ฐ๋๋ก ํด์ fullScreen์ฒ๋ผ ๋ณด์ด๊ฒ ํจ
.ignoresSafeArea(.all)
}
}
#Preview {
CustomPopUpView(
showPopUp: .constant(false),
title: "๊ณต์ง",
message: "์ ๋ง๋ก ์ญ์ ๋ฅผ ํ์๊ฒ ์ต๋๊น?",
btn1: "ํ์ธ",
btn2: "์ทจ์"
)
}
-- ํด๋น ๋ทฐ์ ๊ตฌํ ๋ด์ฉ ๋ฐ ์ค๋ช
์ ์ฃผ์์ผ๋ก ์์ฑํ๋ค.
<ํ์
์ ๋์ธ View>
import SwiftUI
struct ContentView: View {
// ํ์
๋์ ์ฌ๋ถ ๊ฒฐ์
@State private var showPopUp: Bool = false
var body: some View {
ZStack {
VStack(spacing: 16) {
Text("test popup animation")
.font(.title)
Button("ํ์
๋์ฐ๊ธฐ") {
print("๋ฒํผ ๋๋ฆ")
// ํ์
๋์ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด state ๋ณ์์ ๋ฐ๋ ๊ฐ์ ์ ๋ฌํด์ค๋ค
// withAnimation์ผ๋ก ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ปค์คํ
ํด์ค๋ค.
// withAnimation์ ์ข
๋ฅ์ ํ์ด๋จธ ์ง์ ๊น์ง ๊ฐ๋ฅํ๋ ํ์ ์ ์ฐพ์๋ณด๊ธฐ!
withAnimation {
showPopUp = true
}
}
.foregroundStyle(.white)
.padding(.horizontal, 20)
.frame(height: 50)
.background(.gray)
}
// showPopUp ๊ฐ์ด true๋ก ๋ฐ๋๋ฉด ํด๋น ํ์
๋ทฐ๋ฅผ ๋์์ค๋ค. (ZStack ํ์ฉ!)
if showPopUp {
showPopUpView(
title: "์๋ด",
message: "์ ๋ง๋ก ์ญ์ ๋ฅผ ํ์๊ฒ ์ต๋๊น? \n์ญ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ์ค ์ ์์ต๋๋ค.",
btn1: "ํ์ธ",
btn2: "์ทจ์"
)
}
}
}
}
extension ContentView {
// showPopUP๊ฐ์ ๋ฐ๋ผ ๋์์ค ๋ทฐ๋ฅผ ํธ์์ extension์ ํจ์๋ก view๋ฅผ ๊ตฌํํด๋์๋ค.
func showPopUpView(
title: String,
message: String,
btn1: String,
btn2: String
) -> some View {
CustomPopUpView(
showPopUp: $showPopUp,
title: title,
message: message,
btn1: btn1,
btn2: btn2
)
}
}
#Preview {
ContentView()
}
-- ํด๋น ๋ทฐ์ ๊ตฌํ ๋ด์ฉ ๋ฐ ์ค๋ช
์ ์ฃผ์์ผ๋ก ์์ฑํ๋ค.
(+)
RoundedCorner๋ ํ ๋ธ๋ก๊ทธ๋ค์์ ์ฝ๊ฒ ์ฐธ๊ณ ํ ์ ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ์์ฑํ๋ค.
struct RoundedCorner: Shape {
var radius: CGFloat = .infinity
var corners: UIRectCorner = .allCorners
func path(in rect: CGRect) -> Path {
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
return Path(path.cgPath)
}
}
extension View {
func roundedCorner(_ radius: CGFloat, corners: UIRectCorner) -> some View {
clipShape(RoundedCorner(radius: radius, corners: corners) )
}
}
References
https://developer.apple.com/documentation/swiftui/zstack
'๐ Dev > ๊ตฌํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] Infinite Carousel ๊ตฌํํ๊ธฐ 1 (feat. Timer) (0) | 2024.09.05 |
---|---|
[SwiftUI] pagerView ๋ง๋ค๊ธฐ (iOS ๋ฒ์ ๋์) (2) | 2024.08.14 |
[SwiftUI] ์ค์ ๋ก ์น์ ์ ์๋คํ๋ค ๊ตฌํํ๊ธฐ (0) | 2024.06.21 |
[SwiftUI] pre/next buttons๊ฐ ์๋ ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ ๊ตฌํํ๊ธฐ (2) | 2024.05.16 |
[SwiftUI] TabView page indicator ์ปค์คํ ํ๊ธฐ (1) | 2024.04.25 |