SwiftUI๋ก ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋ค๋ณด๋ฉด frame ๋๋ฌธ์ ์ ๋ฅผ ๋จน๋ ๊ฒฝํ์ ์ข ์ข ํ๊ฒ ๋๋ค. ์ต๊ทผ ํ์ฌ์์ ์งํ์ค์ธ ํ๋ก์ ํธ์ main ๊ฐํธ ์์ ์ ์งํํ๋ฉด์, ์ญ์๋ frame ๋๋ฌธ์ ํค๋งจ ์ ์ด ์์ด์ ์ด์ฐธ์ ํด๋น ๋ชจ๋ํ์ด์ด๋ฅผ ์ ๋ฆฌํ๋ค.
Frame Modifier in SwiftUI
- SwiftUI์์ frame์ ๋ทฐ์ ์ฌ์ด์ฆ์ ์์น๋ฅผ ์ ํ๋๋ฐ ์ฌ์ฉ์ด ๋๋ค. ๋ ํ์ด์ฐ์๋ฉด, ํด๋น ๋ชจ๋ํ์ด์ด๋ฅผ ์ฌ์ฉํด์ ๋ทฐ์ ๋๋น์ ๋์ด, ์ต๋/์ต์ ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ์ ๋ ฌ ๋ฐฉ์๊ณผ ์์น๋ฅผ ์ ํ ์ ์๋ค.
๊ณ ์ frame
- ๋งค๊ฐ๋ณ์
func frame(
width: CGFloat? = nil,
height: CGFloat? = nil,
alignment: Alignment = .center
) -> some View
→ ๊ณ ์ frame ๋ชจ๋ํ์ด์ด๋ ์์ ๊ฐ์ ๋ชจ๋ํ์ด์ด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค.
- nil๋ก ์ค์ ํ ์ ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ก ์ง์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ผญ ์ง์ ํด์ฃผ์ง ์์๋ ๋๋ค.
- alignment๊ฐ์ ๊ฒฝ์ฐ swiftUI์์๋ .center๊ฐ ์ ๋ ฌ์ default๊ฐ์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด center๋ก ์ ๋ ฌ ๋์ด ๋ทฐ๊ฐ ๊ทธ๋ ค์ง๋ค.
- ์ฐธ๊ณ ๋ก ์ ๋ ฌ์ ๊ฐ์๋ .top, .bottom, .center, .topLeading, .topTrailing, .bottomLeading, .bottomTrailing, .trailing, .leading ๋ฑ์ด ์๋ค. ๊ฐ์ ์ด๋ฆ์ ๋ณด๋ฉด ๊ต์ฅํ ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๋์ถฉ ์ด๋ค ์ ๋ ฌ์ธ์ง ์ ์ ์๋ค.
Positions this view within an invisible frame with the specified size.
- ๊ณต์๋ฌธ์์์๋ ์ง์ ํ ์ฌ์ด์ฆ์ ๋ณด์ด์ง ์๋ ํ๋ ์ ์์ญ์ผ๋ก ๋ทฐ์ ์์น๋ฅผ ์ง์ ํ๋ ๋ชจ๋ํ์ด์ด๋ผ๊ณ ์ค๋ช ํ๊ณ ์๋ค.
frame์ ์ด๋ป๊ฒ ์ ํด์ง๋ ๊ฑธ๊น?
Text("Hello, world!")
.background(.yellow)
.frame(width: 100, height: 100)
.background(.red)
์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก frame์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ ๋๋ ์ง ํ์ธํ๊ณ ์ถ์ด์ ์ ์์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
- yellow๋ก ์ง์ ๋ ๋ถ๋ถ์ text ์์ญ์ด๊ณ , red๋ก ์ง์ ํ ๋ถ๋ถ์ frame์ ์์ญ์ด๋ค.
- frame์ผ๋ก ์ง์ ํ ๋ถ๋ถ๋งํผ์ธ width 100, height 100์ผ๋ก ์ฌ์ด์ฆ๊ฐ ์ ํด์ ธ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
- alignment๋ฅผ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ด ๋์ด ์์์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ ๊ถ๊ธํด์ง ์๊ฐ ์๋ค. width์ heigh์ optional์ด๊ณ , ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ก ์ง์ ์ด ๋๋ค๋๋ฐ ๊ทธ๊ฒ ์ด๋ค ์ฌ์ด์ฆ๋ฅผ ์๋ฏธํ๋๊ฐ์ ๋ํด์ ๋ง์ด๋ค.
Text("Hello, world!")
.background(.yellow)
// .frame(width: 100, height: 100)
.background(.red)
- ์ง์ ํด๋ width์ height์ ์ฃผ์์ฒ๋ฆฌ ํ๋๋ frame ์์ญ์ผ๋ก ์ค์ ํ๋ red ์์ญ์ด ๋ณด์ด์ง ์์๋ค.
- ํ ์คํธ ์์ญ๋ง์ด ๋ณด์ด๋๋ฐ, SwiftUI์์ ์ง์ ํ ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ ์ ์ด๋ฏธ์ง์ฒ๋ผ ์ปจํ ์ธ ์ ์ฌ์ด์ฆ๋ฅผ ์๋ฏธํ๋ค.
์ค๋ณต์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊น?
์ด๋ฏธ frame์ผ๋ก ํ๋ฒ ๋ทฐ์ ์์น๋ฅผ ์ก์์ฃผ์๋๋ฐ, ํ๋ ์์ ๋ ์ฌ์ฉํด์ ๋ทฐ ์์น๋ฅผ ๋ณ๊ฒฝํ ์ ์์๊น ๊ถ๊ธํด์ก๋ค.
Text("Hello, world!")
.background(.yellow)
.frame(width: 100, height: 100)
.background(.red)
.frame(width: 150, height: 150)
.background(.blue)
์์ ์ฝ๋๋ก ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๊ฐ๋ก์ธ๋ก๋ฅผ 100์ฉ ์ก์๋ ๋ ๋์์ญ ๋ฐ๊นฅ์ผ๋ก 150์ฉ ์ก์ ๋ธ๋ฃจ์์ญ์ด ์๊ธฐ๋ฉด์ ์ปจํ ์ธ ๋ทฐ์ ์์น๋ผ๋๊ฐ ์ฌ์ด์ฆ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ๋ฐ๋ผ์, ํ๋ ์์ ์ฐ์์ ์ผ๋ก ์ถ๊ฐํด๋ ์ถ๊ฐํ ๊ฐ๋งํผ ๋ทฐ์ ์์น์ ์ฌ์ด์ฆ๋ฅผ ๋ณ๊ฒฝ์ํฌ ์ ์๋ค.
๊ฐ๋ณ frame
์ด ์คํฐ๋๋ฅผ ์งํํ๊ฒ ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ด์ ๋ชฉ์ ์ธ ๊ฐ๋ณ frame.
๊ณ ์ frame์ ์ฌ์ฉํ๋ฉด ๊ธฐ๊ธฐ ๋์์ด ๋์ง ์์ ๊ฒ ๊ฐ์์ ๊ฐ๋ณ frame์ ์์ฃผ ์ฌ์ฉํ๋ค ๋ชปํด ๋จ๋ฐ์ ํ ๊ฒฝํ์ด ์๋๋ฐ, ๊ทธ๋์ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํด์ผํ๊ณ ์ด๋ป๊ฒ ๋ทฐ์ ์ ์ฉ๋๋์ง ์ ํํ ์ดํดํ๊ณ ์ฐ์ง ๋ชปํ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋์ ๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ฃจ๋ ๊ฐ๋ณ frame์ ์ ๋๋ก ํ๋ณด์๋ค.
maxWidth, maxHeight
maxWidth: The maximum width of the resulting frame.
maxHeight: The maximum height of the resulting frame.
- ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, maxWidth์ maxHeight๋ ์ต์ข frame์ width์ height์ ์ต๋๊ฐ์ ์๋ฏธํ๋ค. ์ฆ, ์ ํด์ง ์ฌ์ด์ฆ๊ฐ ํด๋น ๊ฐ๋ณด๋ค ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
Text("1. ๋ํด๋ฌผ๊ณผ ๋ฐฑ๋์ฐ์ด ๋ง๋ฅด๊ณ ๋ณ๋๋ก ํ๋๋์ด ๋ณด์ฐํ์ฌ ์ฐ๋ฆฌ๋๋ผ ๋ง์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ 2. ๋จ์ฐ ์์ ์ ์๋๋ฌด ์ฒ ๊ฐ์ ๋๋ฅธ ๋ฏ ๋ฐ๋ ์๋ฆฌ ๋ถ๋ณํจ์ ์ฐ๋ฆฌ ๊ธฐ์์ผ์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ")
.background(.yellow)
์์์ฝ๋๋ก ํ๋ ์์ ์ง์ ํ์ง ์๊ณ ์ ๊ตญ๊ฐ 1์ ๊ณผ 2์ ๊ฐ์ฌ๋ฅผ ์ ์ด๋ณด์๋ค.
์ ์ด๋ฏธ์ง์ฒ๋ผ ๊ฐ์ฌ์ ๊ธธ์ด๋งํผ ์ฌ์ด์ฆ๊ฐ ์ ํด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Text("1. ๋ํด๋ฌผ๊ณผ ๋ฐฑ๋์ฐ์ด ๋ง๋ฅด๊ณ ๋ณ๋๋ก ํ๋๋์ด ๋ณด์ฐํ์ฌ ์ฐ๋ฆฌ๋๋ผ ๋ง์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ 2. ๋จ์ฐ ์์ ์ ์๋๋ฌด ์ฒ ๊ฐ์ ๋๋ฅธ ๋ฏ ๋ฐ๋ ์๋ฆฌ ๋ถ๋ณํจ์ ์ฐ๋ฆฌ ๊ธฐ์์ผ์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ")
.background(.yellow)
.frame(maxWidth: 100, maxHeight: 100)
.background(.red)
์ฌ๊ธฐ์ ์ต๋ ์ฌ์ด์ฆ๋ฅผ 100์ฉ์ผ๋ก ์ง์ ํด๋ณด์๋ค.
- maxFrame์ ์ถ๊ฐํด์ฃผ๊ธฐ ์ ๊ณผ ๋ฌ๋ฆฌ ์ต๋ ๋์ด์ ๋๋น๊ฐ์ ๋์ง ์๊ฒ ๋ทฐ์ ์ฌ์ด์ฆ๊ฐ ์กฐ์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- maxFrame์ ์ปจํ ์ธ ์ฌ์ด์ฆ์ ์๊ด์์ด ๋ณธ์ธ์ด ์ง์ ํ ๊ฐ์ ๋๊ธฐ์ง ์๊ฒ ์ฌ์ด์ฆ๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค.
minWidth, minHeight
minWidth: The minimum width of the resulting frame.
minHeight: The minimum height of the resulting frame.
- ๋ฐ๋๋ก, minWidth์ minHeight๋ ์ต์ข frame์ width์ height์ ์ต์๊ฐ์ ์๋ฏธํ๋ค. ์ฆ, ์ ํด์ง ์ฌ์ด์ฆ๊ฐ ํด๋น ๊ฐ๋ณด๋ค ์์์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
Text("1. ๋ํด๋ฌผ๊ณผ ๋ฐฑ๋์ฐ์ด ๋ง๋ฅด๊ณ ๋ณ๋๋ก ํ๋๋์ด ๋ณด์ฐํ์ฌ ์ฐ๋ฆฌ๋๋ผ ๋ง์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ 2. ๋จ์ฐ ์์ ์ ์๋๋ฌด ์ฒ ๊ฐ์ ๋๋ฅธ ๋ฏ ๋ฐ๋ ์๋ฆฌ ๋ถ๋ณํจ์ ์ฐ๋ฆฌ ๊ธฐ์์ผ์ธ ๋ฌด๊ถํ ์ผ์ฒ๋ฆฌ ํ๋ ค ๊ฐ์ฐ ๋ํ ์ฌ๋ ๋ํ์ผ๋ก ๊ธธ์ด ๋ณด์ ํ์ธ")
.background(.yellow)
.frame(minWidth: 100, minHeight: 100)
.background(.red)
maxWidth์ maxHeight์ ์๋ฆฌ์ minWidth์ minHeight๋ก ๋์ฒดํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
๋งจ ์ฒ์ ํ๋ ์์ ์ง์ ํด์ฃผ๊ธฐ ์ ์ฝํ ์ธ ์ฌ์ด์ฆ๊ฐ ๋์จ๋ค.
Text("1. ๋ํด๋ฌผ")
.background(.yellow)
.frame(minWidth: 100, minHeight: 100)
.background(.red)
๊ทธ ์ด์ ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ ๊ตญ๊ฐ ๋ด์ฉ์ ์ค์ฌ๋ณด์๋ค.
- ์ปจํ ์ธ ์ฌ์ด์ฆ(๋ ธ๋์ ์์ญ)์ด 100๋ณด๋ค ์์ ๋, ๋ทฐ์ ํ๋ ์ ์ฌ์ด์ฆ(๋ ๋ ์์ญ)์ด 100์ผ๋ก ์กํ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ฆ, ๋ทฐ๊ฐ 100๋ณด๋ค ์์๋ ๋ทฐ ์ฌ์ด์ฆ์ ์ต์๊ฐ์ผ๋ก ์ง์ ํ 100๋ณด๋ค ์์์ง์ง ์๊ฒ ์ต์ ํฌ๊ธฐ๋ฅผ ๋ณด์ฅํ ์ฑ๋ก ํ๋ ์์ ์ก์์ค๋ค.
- ๋ทฐ์ ์ต์ ์ฌ์ด์ฆ๋ฅผ ๋ณด์ฅํ๋ ํด๋น ํ๋ ์์ ์ฌ์ฉํ๋ฉด ์ปจํ ์ธ ์ ์ฌ์ด์ฆ๊ฐ 100๋ณด๋ค ์ปค์ง๋ฉด ์ง์ ํ ์ต์๊ฐ๋ณด๋ค ์ปค์ง๋ ๊ฒ์ ์ ์ ์๋ค.
์ถ๊ฐ ํ์ต
infinity
- A size proposal that contains infinity in both dimensions.
- Both dimensions contain infinity in this size proposal. Subviews of a custom layout return their maximum size when you propose this value using the dimensions(in:) method. A custom layout should also return its maximum size from the sizeThatFits(proposal:subviews:cache:) method for this value.
screen ๊ฐ๋ก/์ธ๋ก ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ ๋ frame์ infinity๋ฅผ ์ข ์ข ์ฌ์ฉํ ๋๊ฐ ์๋๋ฐ, ์กฐ๊ธ ๋ ์ ํํ ์๊ณ ์ถ์ด์ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํด๋ณด์๋ค. infinity๋ type property๋ก ์ต๋ ์ฌ์ด์ฆ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์, ํนํ ์์ ์ด ํ์ ๋ทฐ์ผ ๋ ๋ถ๋ชจ ๋ทฐ์ ์ฌ์ด์ฆ๋ฅผ ์ต๋๊ฐ์ผ๋ก ์ฑ์ด๋ค.
๋์ , infinity๋ก width๋ฅผ ์ก์ผ๋ฉด ๋ณด๋ผ์ UI layout ๊ฒฝ๊ณ ๊ฐ ๋ฐ ๋๊ฐ ์์ด์
extension View {
/// ํ๋ฉด ๋๋น ๊ฐ์ ธ์ด
func getScreenWidth() -> CGFloat {
return UIScreen.main.bounds.width
}
}
ํ์ฌ์์ SwiftUI๋ก ์์ ํ ๋ ์์ ๊ฐ์ ํจ์๋ฅผ extension์ผ๋ก ๋ง๋ค์ด์ .infinity๊ฐ์ UIKit์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฐํํ์ฌ ์ ์ฉํ๊ณ ์๋ค.
์์ฝ
- frame ๋ชจ๋ํ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์ ๋๋น, ๋์ด, ์ต๋/์ต์ ํฌ๊ธฐ, ์ ๋ ฌ ๋ฐฉ์ ๋ฐ ์์น๋ฅผ ์กฐ์ ํ ์ ์๋ค.
- frame ๋ชจ๋ํ์ด์ด๋ฅผ ์ค๋ณต ์ฌ์ฉํ์ฌ ๋ทฐ์ ์์น์ ์ฌ์ด์ฆ๋ฅผ ์ฐ์์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
- maxWidth์ maxHeight๋ ์ต๋ ์ฌ์ด์ฆ๋ฅผ ์ ํํ๋ฉฐ, minWidth์ minHeight๋ ์ต์ ์ฌ์ด์ฆ๋ฅผ ๋ณด์ฅํ๋ค.
- infinity๋ ์ต๋ ์ฌ์ด์ฆ๋ฅผ ๋ํ๋ด๋ฉฐ, ํ๋ฉด ๋๋น๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์๋ค.
- frame ๋ชจ๋ํ์ด์ด๋ฅผ ํ์ฉํ ๋ .infinity ๊ฐ์ ์ฌ์ฉํ ๋ ๋ณด๋ผ์ UI layout ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฃผ์๊ฐ ํ์.
References
- https://developer.apple.com/documentation/swiftui/view/frame(width:height:alignment:)
- https://developer.apple.com/documentation/swiftui/view/frame(minwidth:idealwidth:maxwidth:minheight:idealheight:maxheight:alignment:)
- https://developer.apple.com/documentation/swiftui/proposedviewsize/infinity
'๐ Dev > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] scrollTargetLayout๊ณผ ScrollTargetBehavior (0) | 2024.08.16 |
---|---|
[SwiftUI] Property Wrapper ์ด์ ๋ฆฌ (0) | 2024.07.26 |
[SwiftUI] @State (0) | 2024.05.22 |
[SwiftUI] NavigationView, NavigationStack, navigationTitle (2) | 2024.04.15 |
[SwiftUI] Info.plist (0) | 2023.11.20 |