๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/SwiftUI

[iOS/SwiftUI] Text, Image ๊ธฐ๋ณธ ์ •๋ฆฌ + ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€

by Danna 2022. 5. 5.
728x90
728x90

โœ๏ธ Text

Text ๋Š” ํ•œ์ค„ ์ด์ƒ์˜ ์ฝ๊ธฐ ์ „์šฉ ๊ธ€์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ View ์ž…๋‹ˆ๋‹ค.

 

Text initializer

Text ์ƒ์„ฑ์ž๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฏธ์ง€๋กœ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ UIKit ๊ณผ๋Š” ๋‹ค๋ฅธ๊ฑฐ ๊ฐ™์•„์š”. NSAttributedString ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ํ…์ŠคํŠธ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œ๊ณตํ•ด์ฃผ๋„ค์š”.

  • init(String) → ๋‹จ์ˆœ ๋ฌธ์ž์—ด, Localized ๊ด€๋ จ ์ƒ์„ฑ์ž๋„ ๋”ฐ๋กœ ์žˆ์–ด์š”.
  • init(AttributedString) → NSAttributedString ์ด๋ž‘ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. (+iOS15)
  • init(Image) → ๋‹ค๋ฅธ Text ๋“ค์ด๋ž‘ ์—ฐ๊ฒฐํ•˜๊ธฐ์œ„ํ•œ Image
  • init(_ date: Date, style: Text.DataStyle)
    • Text.DataStyle : date, offset, relative, time, timer ๋“ฑ ์Šคํƒ€์ผ

 

Text ์Šคํƒ€์ผ ์„ค์ • ๋ฉ”์†Œ๋“œ

  • font(Font?) : Font ๊ตฌ์กฐ์ฒด์— ์ •์˜๋œ title, caption ๋“ฑ์˜ ๊ธฐ๋ณธ ํฐํŠธ์™€ ์‹œ์Šคํ…œ ํฐํŠธ, ์ปค์Šคํ…€ ํฐํŠธ ๋“ฑ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • fontWeight(Font.Weight?) : black, bold, light, medium, regular ๋“ฑ ํฐํŠธ์˜ ๊ตต๊ธฐ์— ๋Œ€ํ•œ ์„ค์ •
  • foregroundColor(Color?) : ํ…์ŠคํŠธ ์ƒ‰์ƒ
  • bold(), italic() : ๊ตต๊ธฐ, ๊ธฐ์šธ์ž„
  • strikethrough(Bool, color: Color?), underline(Bool, color: Color?) : ์ทจ์†Œ์„ , ๋ฐ‘์ค„
  • monospacedDigit() : ๊ธ€์ž์™€ ์ˆซ์ž์˜ ๋„ˆ๋น„๋ฅผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •
  • kerning(CGFloat), tracking(CGFloat) : ์ž๊ฐ„ ๊ด€๋ จ .. ๋‘˜ ๋‹ค ์ ์šฉํ•œ๋‹ค๋ฉด kerning ๋ฌด์‹œ tracking ๋งŒ ์ ์šฉ๋œ๋‹ค.
  • textCase(Text.Case?) : ์†Œ๋ฌธ์ž ๋˜๋Š” ๋Œ€๋ฌธ์ž๋งŒ ์ ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

 

Handling Multiline Text

  • lineLimit(Int?) : Int ๊ฐ’์œผ๋กœ ๊ธธ์ด ์ œํ•œ, ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ nil ๋กœ ๊ธธ์ด๋Š” ๋ฌด์ œํ•œ์œผ๋กœ ์„ค์ •๋œ๋‹ค.
  • lineSpacing(CGFloat) : ํ–‰๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • multilineTextAlignment(TextAlignment) : ์—ฌ๋Ÿฌ์ค„์ผ๋•Œ ํ…์ŠคํŠธ์˜ ์ •๋ ฌ(center, leading, trailing)์„ ์„ค์ •ํ•œ๋‹ค.


๐Ÿ–ผ Image

Image ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ์œ„ํ•œ View ์ž…๋‹ˆ๋‹ค.

 

PNG, JPEG, HEIC ๋“ฑ์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์•ฑ ๋‚ด์— asset ๋˜๋Š” bundle ๋กœ ์ €์žฅํ•˜๋ฉด, Image ํƒ€์ž…์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์–ด์š”. Image ๋Š” ๊ธฐ์กด์˜ UIImage, NSImage ์™€ ๊ฐ™์€ ํ”Œ๋žซํผ๋ณ„ ์ด๋ฏธ์ง€ ํƒ€์ž…์˜ instance ์ž…๋‹ˆ๋‹ค. UIImage ๋Š” UIKit ์ด๋ฏธ์ง€ ํƒ€์ž…์œผ๋กœ, ํ•ด๋‹น ์ด๋ฏธ์ง€ ํƒ€์ž…์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜๋„ค์š”.

 

Image initializer

  • init(String, bundle: Bundle?) : asset ํด๋”์— ์ €์žฅํ•œ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • init(String, bundle: Bundle?, label: Text) : ์œ„์™€ ๋™์ผํ•˜์ง€๋งŒ, label ์„ ์ง€์ •ํ•ด ์ ‘๊ทผ์„ฑ ์ œ๊ณต์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • init(systemName: String) : ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€์ธ SF Symbols ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • init(uiImage: UIImage) : UIKit ์ด๋ฏธ์ง€ ํƒ€์ž…์ธ UIImage ์„ Swift ์ด๋ฏธ์ง€ ํƒ€์ž…์ธ Image ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

Image resizable & aspectRatio

Image ์— frame ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์›๋ณธ ๋น„์œจ๊ณผ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ , resizable ๋ฉ”์†Œ๋“œ๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ๋งŒ Image ๋น„์œจ์ด ์žฌ์„ค์ •๋ผ์š”.

 

์•„๋ž˜ ์บก์ณ์—์„œ resizable() ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋Š” frame ์„ ๋ฒ—์–ด๋‚œ ๊ฑธ ๋ณด์‹ค ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ‘€ resizable() ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์šฉํ•˜๋ฉด frame ์— ๋”ฑ๋งž๊ฒŒ ์‚ฌ์ด์ฆˆ๊ฐ€ ์žฌ์กฐ์ •๋ฉ๋‹ˆ๋‹ค. resizable ๋ฉ”์†Œ๋“œ๋งŒ ์ ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€ ๋น„์œจ์ด ์œ ์ง€๋˜์ง€ ์•Š๊ธฐ์— ๋Š˜์–ด์ ธ ๋ณด์ž…๋‹ˆ๋‹ค.

 

aspectRatio ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด content mode ๋ฅผ ์ง€์ •ํ•ด์„œ ์ด๋ฏธ์ง€ ์›๋ณธ์˜ ๋น„์œจ์— ๋งž๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. fit ์€ frame ๋‚ด๋ถ€์— ๋งž๊ฒŒ ์กฐ์ ˆ๋˜๊ณ , fill ์€ frame ์˜ ์ตœ๋Œ€์— ๋งž๊ฒŒ ์กฐ์ ˆ๋ฉ๋‹ˆ๋‹ค. 

 

ํ•ด๋‹น ๋ฌธ์„œ์— Fitting Image ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์ ํ˜€์žˆ๊ณ , ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”!

https://developer.apple.com/documentation/swiftui/fitting-images-into-available-space


๐Ÿ”— ์ฐธ๊ณ  ๋ฌธ์„œ

 

728x90
728x90