Search

Dynamic Type

Thanks to, Hyungyu Kim
๐Ÿ“—
์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํ…์ŠคํŠธ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒƒ
์„ค์ • > ๋””์Šคํ”Œ๋ ˆ์ด ๋ฐ ๋ฐ๊ธฐ > ํ…์ŠคํŠธ ํฌ๊ธฐ
์•ฑ ๋‚ด์— Dynamic Type์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๊ธฐ์—์„œ ํ…์ŠคํŠธ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ ์ ์šฉ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์„ค์ • > ์†์‰ฌ์šด ์‚ฌ์šฉ > ๋””์Šคํ”Œ๋ ˆ์ด ๋ฐ ํ…์ŠคํŠธ ํฌ๊ธฐ > ๋” ํฐ ํ…์ŠคํŠธ
์ถ”๊ฐ€๋กœ 5๊ฐœ์˜ ๋” ํฐ ์‚ฌ์ด์ฆˆ๋„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

HIG ๋ฌธ์„œ์—์„œ ๋งํ•˜๋Š” Dynamic Type

๐Ÿ“—
Dynamic Type ์€ ๊ธ€์ž๋ฅผ ์ฝ๋Š”์ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ํ…์ŠคํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€์ ์ธ flexibility(์œ ์—ฐ์„ฑ)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Dynamic Type ์€ xSmall, Small, Medium, Large(Default), xLarge, xxLarge, xxxLarge ์ด๋ ‡๊ฒŒ ์ด 7๊ฐ€์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Dynamic Type ์— ๋”ฐ๋ฅธ ํ…์ŠคํŠธ ์Šคํƒ€์ผ์˜ weight, size, leading(ํ–‰๊ฐ„)
โ€ข
์‹œ์Šคํ…œ์€ ์ ‘๊ทผ์„ฑ์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•ด์„œ ๋” ํฐ ํฌ๊ธฐ์˜ ์‚ฌ์ด์ฆˆ๋„ ์ œ๊ณต
์ถœ์ฒ˜:
WWDC ์—์„œ ๋ฐœํ‘œํ•  ๋•Œ Dynamic Type ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ์ œ์‹œํ•ด์ค๋‹ˆ๋‹ค.
โ€ข
Text is large enough for the user to read
โ€ข
Text is fully readable
โ€ข
App UI looks beautiful

1.Fitting Large Text on Screen

ํฐ์ƒ‰ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด์ฆˆ๋ผ๊ณ  ํ•ด๋ณผ๊นŒ์š”?
ํฐํŠธ์‚ฌ์ด์ฆˆ๋ฅผ ํ‚ค์šฐ๋ฉด ์ด๋ ‡๊ฒŒ ์‚ฌ์ด์ฆˆ ๋ฐ–์œผ๋กœ ๊ธ€์ž๊ฐ€ ๋‚˜๊ฐ€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
๋ง์ค„์ž„ ์˜ต์…˜์„ ๋„ฃ์–ด๋„ ํ…์ŠคํŠธ๊ฐ€ ๋‹ค ์ฝํžˆ์ง€ ์•Š์ง€์š”!
์ด๋•Œ๋Š” multiple lines ๋ฅผ ์„ค์ •ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

2.Avoid Constant Values Based on Default Text Size

ํ…์ŠคํŠธ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒ์ˆ˜๊ฐ’์€ ํฐํŠธ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
(์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์  top๊ณผ bottom ์œผ๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก๋Š”๋ฐ ์ด๊ฑด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•„์š”)
๊ทธ๋ž˜์„œ First Label ์˜ First Baseline ๊ณผ Second Label ์˜ Last Baseline ์„ ๊ธฐ์ค€์œผ๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์ฃผ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ)
์˜คํ† ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3.Side-By-Side Text

์ด๋ฒˆ์—๋Š” ๋…ธ๋ž€์ƒ‰ ๋ฐ•์Šค๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ์Šคํฌ๋ฆฐ์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
ํฐํŠธ๋ฅผ ํ‚ค์šฐ๊ฒŒ ๋˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค..!
์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ fully readable ์— ๋งž์ง€ ์•Š์œผ๋‹ˆ multiple lines ๋ฅผ ์ ์šฉํ•ด์ค๋‹ˆ๋‹ค.
๋ชฉํ‘œ์—์„œ looks beautiful ์ด๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ ์ด๋ ‡๊ฒŒ vertical ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋” ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ์ ์šฉํ•˜๊ธฐ

struct PostView: View { let post: Post var body: some View { VStack(alignment: .leading) { Image(post.image) Text(post.title) .font(.headline) Text(post.time) .font(.subheadline) Text(post.body) .font(.body) } } } // iOS 14 + Text("Scaling") .font(.custom("Georgia", size: 24, relativeTo: .headline))
Swift
๋ณต์‚ฌ

ํฐํŠธ ์‚ฌ์ด์ฆˆ ๊ตฌํ•˜๊ธฐ

preferredContentSizeCategory ๋กœ ์‚ฌ์šฉ์ž์˜ ํฐํŠธ์‚ฌ์ด์ฆˆ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
struct ContentView: View { @Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory let largeSizeCategories: [ContentSizeCategory] = [.extraExtraLarge, .extraExtraExtraLarge, .accessibilityMedium, .accessibilityLarge, .accessibilityExtraLarge, .accessibilityExtraExtraLarge, .accessibilityExtraExtraExtraLarge] var body: some View { Group { if largeSizeCategories.contains(sizeCategory) { VStack { Text("Pizza, bananas, donuts") Text("Io, Europa, Ganymede") } } else { HStack { Text("Pizza, bananas, donuts") Text("Io, Europa, Ganymede") } } } } }
Swift
๋ณต์‚ฌ

Dynamic Type ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

Simulator

WWDC 2019 - Visualย Designย andย Accessibility ์—์„œ Accessibility ๋ฅผ ์†Œ๊ฐœํ•˜๋ฉด์„œ Dynamic Type ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
Xcode > Open Developer Tool > Accessibility Inspector
โ€ข
์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ์šฐ์ธก ์ƒ๋‹จ์˜ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ Dynamic Type ์„ ์†์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.
์ถœ์ฒ˜ :