์ก์ก ์๋
ํ์ธ์ ์ด์์์, ์ด๋ฒ ํฌ์คํธ์์๋ SwiftUI์์ Image
๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ํฌ์คํ
ํ๋ ค๊ณ ํด์๐๏ธ.
์ด๋ฏธ์ง(Image)๋ SwiftUI์์ ํ๋ฉด์ ๊ทธ๋ํฝ ์ปจํ
์ธ ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ทฐ ์์์์. ์ด๋ฏธ์ง๋ ์ ์ ์ด๋ฏธ์ง๋ ๋์ ์ด๋ฏธ์ง๋ฅผ ํํํ๋ฉฐ, ๋ค์ํ ๋ฆฌ์์ค์์ ๋ก๋ํ ์ ์์ด์. SwiftUI์ Image
๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ์ฝ๊ฒ ํ์ํ๊ณ ์กฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฏธ์ง์ ํฌ๊ธฐ, ๋น์จ, ๋ ๋๋ง ์ต์
๋ฑ์ ์กฐ์ ํ์ฌ ๋ค์ํ ์๊ฐ์ ํจ๊ณผ๋ฅผ ๊ตฌํํ ์ ์์ด์. ๋ํ, ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฅธ ๋ทฐ์ ์กฐํฉํ์ฌ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ฉํ ์ ์์ด์.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก์ ํธ ๋ด๋ถ์ ์๋ Assets.xcassets ํ์ผ์ ์ด๋ฏธ์ง ์ (Image Set)์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด์์.
Assets.xcassets
ํ์ผ๋ก ์ด๋ํด์.์ด์ ์ด๋ฏธ์ง ๋ฑ๋ก์ด ์๋ฃ๋์์ด์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฑ๋กํ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ด์.
๐ก Namespace๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
๋ง์ฝ ํด๋ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์งํํ ์ ์์ด์.
๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ด๋ฆฌํ๋ค๋ฉด Image(โimages/MyImageโ)
์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ด์.
Assets.xcassets
ํ์ผ์์ New Folder with Namespace
๋ฅผ ์ ํํด์ฃผ์ธ์.Image(โimages/MyImageโ)
๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ด์.Image ๊ตฌ์กฐ์ฒด์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ์ฐ๋ฆฌ๊ฐ ์ง์ ํ ์ด๋ฏธ์ง ์ด๋ฆ์ ์์ฑํด์. Image(โMyImageโ)
๋ก ์์ฑํ๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ง์ ํ ์ด๋ฏธ์ง๊ฐ ๋๋๋ง ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
Image("MyImage")
.border(.blue, width: 5)
์ด๋ฏธ์ง์ ํ๋ ์(ํ)์ ์ค์ ํ ์ ์์ด์.
Image("images/MyImage")
.border(.red, width: 5)
.frame(width: 150, height: 150)
.border(.blue, width: 5)
.border(.red, width: 5)
๋ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋งํผ ํ
๋๋ฆฌ๊ฐ ์ค์ ๋์์ด์.
.border(.blue, width: 5)
๋ frame(width: 150, height: 150)
์ด ์ค์ ๋๊ณ ๋ ์ดํ ํ
๋๋ฆฌ๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์, ๋๋น 150, ๋์ด 150 ๋งํผ์ ํ
๋๋ฆฌ๊ฐ ์๊ฒจ๋ฌ์ด์.
์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ ๊ทธ๋๋ก ๋ ๋๋งํด์. ๋ฐ๋ผ์ frame์ ํฌ๊ธฐ๋งํผ ์ด๋ฏธ์ง๋ฅผ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด resizable()
์ ํตํด ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ์ ํ์ฉํด์ผํด์.
Image("images/MyImage")
.resizable()
.frame(width: 150, height: 150)
.border(.blue, width: 5)
.frame(width: 200, height: 200)
.border(.red, width: 5)
resizable()
์ ํตํด ์ด๋ฏธ์ง๊ฐ frame์ ๋ง๊ฒ ๋ณ๊ฒฝ๋์์ด์! ์ฌ๊ธฐ์ ๋ ๋์๊ฐ frame(width: 200, height:200)
์ ํตํด ํ๋ ์์ ํ๋ฒ ๋ ์์ฐ๊ณ ํ
๋๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด ์์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ frame์ ์ค์ ํ ์ ์์ด์.
๋ง์ฝ frame์ ์ค์ ํ์ง ์๊ณ resizable()
๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ์ง๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ทฐ์ ๋ฒ์ ๋งํผ ์ฐจ์งํด์.
์ด๋ฏธ์ง์ ๋ถํฌ๋ช ๋๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด์๋ opacity()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์. 0๋ถํฐ 1๊น์ง์ ๊ฐ์ ์ธ์๋ก ๋๊ธธ ์ ์์ผ๋ฉฐ, 0์ ๊ฐ๊น์ธ์๋ก ํฌ๋ช ํด์ ธ์.
Image("MyImage")
.opacity(0.8)
.aspectRatio(_ ratio: CGFloat?, contentMode: ContentMode)
.aspectRatio()
๋ SwiftUI์์ ๊ฐ๋ก์ธ๋ก ๋น์จ์ ์กฐ์ ํ๋๋ฐ ์ฌ์ฉํด์. aspectRatio๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ฉด์ ์ด๋ฏธ์ง๋ฅผ ํน์ ๋น์จ๋ก ์กฐ์ ํ ์ ์์ด์.
ratio
: ์ํ๋ ๊ฐ๋ก์ธ๋ก ๋น์จ์ ์ง์ ํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, 1.0์ 1:1 ๋น์จ. 0.5๋ 1:2์ ๋น์จ์ ๋ํ๋ด๋ฉฐ, nil
์ ์ง์ ํ๋ฉด ์๋ ์ด๋ฏธ์ง ๋น์จ์ ์ ์งํด์.1.0
: ๊ฐ๋ก์ธ๋ก 1:1 ๋น์จ0.5
: ๊ฐ๋ก 1 ์ธ๋ก 2 ๋น์จ16/9
: ๊ฐ๋ก์ธ๋ก 16:9 ๋น์จ3/2
: ๊ฐ๋ก์ธ๋ก 3:2 ๋น์จcontentMode
: ratio๋ฅผ ํตํด ๋น์จ์ ์กฐ์ ํ ํ ๋ทฐ์ ๋ด์ฉ์ ์ด๋ป๊ฒ ๋ฐฐ์นํ ์ง ๊ฒฐ์ ํ๋๋ฐ ์ฌ์ฉํด์.fit
: ์ฝํ
์ธ ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ์ธ๋ก ๋ฐ ๊ฐ๋ก๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ ์์ ๋ง๋๋ก ํ๋ ์ต์
์ด์์.fill
: ์ฝํ
์ธ ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ์ธ๋ก ๋ฐ ๊ฐ๋ก๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณต๊ฐ์ ์ฐจ์งํ๋๋ก(occupy) ํ๋ ์ต์
์ด์์.ratio
๋ฅผ 0.5(1/2)์ ๋น์จ๋ก ์กฐ์ ํ๊ณ fit
์ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ทฐ ๋ด์์ ์ด๋ฏธ์ง ๋น์จ์ ์ ์งํ๋ฉด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ์์์์. ํ์ฌ ์ฝ๋ ๋ด์๋ ํ๋์ ๋ทฐ์ ํ๋์ ์ด๋ฏธ์ง๋ง ๋ค์ด๊ฐ๋๋ก ๋์ด ์์ด ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ๋ ๋ชจ์ต์ด์์!
ratio
๋ฅผ ์ฌ์ฉํ์ฌ ๋น์จ์ ์กฐ์ ํ๊ณ fit
์ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ทฐ ๋ด์์ ์ด๋ฏธ์ง ๋น์จ์ ์ ์งํ๋ฉด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ์์์์.
ratio
๋ฅผ 1/2์ ๋น์จ๋ก ์ค์ ํ๊ณ fill
๋ก ์ค์ ํ์ด์. ์ด๋ ๊ฒ๋ง ๋ด์๋ fit๊ณผ์ ์ฐจ์ด๋ฅผ ์ ๋ชจ๋ฅผ ์ ์์ง๋ง ์๋์ ์์์์ ๊ทธ ์ฐจ์ด์ ์ ํ์ธํ ์ ์์ด์!
์ด๋ฒ์๋ ์์ ์์์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ratio๋ฅผ ์ค์ ํ๊ณ contentMode๋ฅผ fill
๋ก ์ ๋ถ ๋ณ๊ฒฝํ์์ด์. ์ด๋ ์ ๊ฐ์? ์ด์ ์ฐจ์ด์ ์ด ๋ณด์ด์๋์? ์ด์ฒ๋ผ fill์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ทฐ๋ฅผ ์ด๊ณผํ์ฌ ์ด๋ฏธ์ง์ ๋น์จ์ ์กฐ์ ํด์. ์์ fit
์ ๊ฒฝ์ฐ์๋ ํ ํ๋ฉด ์์ ์ด๋ฏธ์ง๋ค์ ๋ค ๋ด์ผ๋ ค๊ณ ํ๋ค๋ฉด, fill
์ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ์ง๊ฐ ๋ทฐ๋ฅผ ๋์ด์ ๋น์จ์ ๋ง์ถฐ ์กฐ์ ๋์์ด์.
์ ๋ฆฌํ์๋ฉด fit
์ ๊ฒฝ์ฐ์๋ ๋ทฐ๋ฅผ ์ค์์ํ๊ณ , fill
์ ๊ฒฝ์ฐ์๋ ์ฝํ
์ธ ๋ฅผ ์ค์์ ์ฌ๊ธด๋ค๊ณ ์๊ฐํ์๋ฉด ์ดํดํ์๊ธฐ ์ข ๋ ์์ํ์ค ๊ฑฐ์์.
clipShape()
๋ชจ๋ํ์ด์ด๋ SwiftUI์์ ๋ทฐ์ ํํ๋ฅผ ์๋ฅด๊ฑฐ๋ ๋ง์คํนํ๋ ๋ฐ ์ฌ์ฉํด์. ์ด ๋ชจ๋ํ์ด์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ ๋ด์ฉ์ ์ง์ ๋ ๋ชจ์์ผ๋ก ์๋ฅผ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ๋ํ ๋ทฐ(์: ์, ์ฌ๊ฐํ) ๋๋ ๊ฒฝ๋ก(Path)๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ๋ฅผ ์๋ผ๋ด๊ฑฐ๋ ๋ชจ์์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉํด์.
Image("images/MyImage")
.clipShape(Circle())
์ด๋ฒ ํฌ์คํ ์์๋ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์์ด์! iOS ๊ฐ๋ฐ์ ํ๋ฉด์ ์ด๋ฏธ์ง ์ปจํธ๋กค์ ํ์์ธ๋ฐ ์ด๋ฒ ํฌ์คํ ์ ํตํด์ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ง ์ ์์ด ์ข์์ด์. ํฌ์คํธ๋ฅผ ์ฝ์ผ์๋ ๋ถ๋ค๋ ์ ๋ฆฌ๊ฐ ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ด์!
๋๋ฌด ์ ๋ฆฌ ์ํด์ฃผ์ จ๋ค์! ๊ฐ์ฌํฉ๋๋ค!