ํฐํธ๋ ํ๋ฆฌํ ๋ค๋ ์ฌ์ฉํจ (์ฌ์ดํธ๋งํฌ)
Pretendard
Pretendard ํ๋ฆฌํ ๋ค๋ Pretendard ํ๋ฆฌํ ๋ค๋ ๊ธ๊ผด ๋ค์ด๋ก๋ ์ผ๋ณธ์ด ๋ฒ์ ๋ค์ด๋ก๋ GitHub์์ ๋ณด๊ธฐ system-ui๋ฅผ ๋์ฒดํ๋ ๊ธ๊ผด Apple์ system-ui๊ฐ ์ต์ํ ๋๋ก์๋ San Francisco์ Apple SD ์ฐ๋๊ณ ๋ Neo๊ฐ ์๋
cactus.tistory.com
- ๊ธ๊ผด ๋ค์ด๋ก๋๋ฅผ ๋๋ฌ์ ๋งฅ์ ์ ์ฅ
- ํผ๊ทธ๋ง์์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ ํญ๋ชฉ์ ๋๋ธ ํด๋ฆญํด์ ์ค์น
Figma
- ํ ์คํธ๋ฅผ ์ถ๊ฐํ ํ ํฐํธ, ํฐํธ์ ๊ตต๊ธฐ, ์๊ฐ, ํ๊ฐ์ ์ง์
- ๊ทธ ํ Text ์์ ์ ๋ค๊ฐ ์์ด์ฝ ํด๋ฆญ
- ํ ์คํธ ์คํ์ผ ๋ฉ๋ด๊ฐ ๋์ค๋ฉด + ๋ฒํผ์ ๋๋ฌ ์๋ก์ด ํ ์คํธ ์คํ์ผ์ ๋ฑ๋ก
- ์๋ก์ด ํ ์คํธ ์คํ์ผ์ ์ด๋ฆ์ ์ง์ ํ ๋ค create style์ ๋๋ฌ ์ ์ฅ
- ์ต์ข ํผ๊ทธ๋ง ๋์์ธ์ ์ด๋ฐ ํํ๋ก ๊ฐ๋ฐ์์๊ฒ ์ ๋ฌ
๊ฐ๋ฐ
- ํฐํธ๋ฅผ ๋ฃ์ด ์ค ํด๋๋ฅผ ์์ฑ
- ํผ๊ทธ๋ง์์ ์ฌ์ฉ๋ ํฐํธ๋ฅผ ํด๋น ํด๋์ ์ํฌํธ
- ํผ๊ทธ๋ง์์ ์ฌ์ฉ๋(๋์์ด๋์ ์ด๋ฏธ ์ด์ผ๊ธฐ ๋ ํฐํธ๋ง) ๋ฃ์ด์ค
- ์ํฌํธ์์ Copy items if needed ๋ฅผ ์ฒดํฌํด์ ํด๋๋ก ๋ณต์ฌํด์ฃผ๊ณ targets๋ ์ฒดํฌํด์ ์ง์
- project > TARGETS > Info ํญ์ผ๋ก ๊ฐ์ "Fonts provided by application" ํ๋๋ฅผ ์์ฑ
- ํน์ ํ๋ ์์์ ๋ง์ฐ์ค ํธ๋ฒํ ๋ ๋ํ๋๋ + ๋ฒํผ์ ๋๋ฌ ํ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋จ
- ์๋ก์ด ํ๋๊ฐ ๋ํ๋๋ฉด Fonts provided by application ์ ๋ ฅ
- ์ถ๊ฐํด ์ค ํฐํธ ํ์ผ๋ช ์ ํ์ฅ์์ ํจ๊ป ๊ทธ๋๋ก ์ ๋ ฅํจ
private func getFontName() {
for family in UIFont.familyNames {
let sName: String = family as String
print("family: \(sName)")
for name in UIFont.fontNames(forFamilyName: sName) {
print("name: \(name as String)")
}
}
}
- ContentView๋ก ์ด๋ํ ๋ค ํด๋น ํจ์๋ฅผ ์์ฑ
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
.onAppear {
getFontName()
}
}
- onAppear modifier๋ฅผ ํตํด ํฐํธ์ ์ค์ ์ด๋ฆ์ ์ฝ์์ ์ฐ์ ์ ์์
- info.plist์ ํฐํธ ํ์ผ์ ๋ฑ๋กํ์ง ์์ผ๋ฉด ๋จ์ง ์์ผ๋ฏ๋ก info.plist์ ์ ๋ณด ๋ฑ๋ก ํ ์ด๋ฆ ํ์ธ ์ฝ๋ ์์ฑํด์ผ ํจ
- ํน์ ํฐํธ์ ๊ฒฝ์ฐ ํ์ผ ์ด๋ฆ๊ณผ ์ค์ ํฐํธ์ด๋ฆ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ์ธํ๋ ๊ณผ์ ์ด ๊ผญ ํ์ํจ
- ํ๋ฒ ์ด๋ฆ์ ์์์ผ๋ ํด๋น ์ฝ๋๋ ์ฃผ์ ์ฒ๋ฆฌํด๋ ๋ฌด๊ด
enum CustomFontName: String {
case light = "Pretendard-Light"
case medium = "Pretendard-Medium"
case extraBold = "Pretendard-ExtraBold"
}
- ํฐํธ ์ค์ ์ด๋ฆ์ ๋์นํ enum ์์ฑ
enum CustomFontStyle {
case header
case caption
case content
}
- ํผ๊ทธ๋ง์์ ๋์ด์จ ์คํ์ผ ๊ฐ์ด๋ ๋๋ก ์ ์
struct CustomFontViewModifier: ViewModifier {
var style: CustomFontStyle
@ViewBuilder // ์ฌ๋ฌ viewModifier๋ฅผ ์ํด์ some View๋ฅผ ๋ฐํํจ
func body(content: Content) -> some View {
switch style {
case .content:
content
.font(.custom(CustomFontName.medium.rawValue, size: 16))
.lineSpacing(25 - 16) // ํ๊ฐ ์ง์ : ํผ๊ทธ๋ง์ ํ๊ฐ์ ํฐํธ์ ํฌ๊ธฐ๊น์ง ๋ํด์ ๊ณ์ฐํ๊ณ SwiftUI๋ ํ๊ณผ ํ ์ฌ์ด์ ๊ณต๊ฐ์ ์๋ฏธํจ
.kerning(16 * 0.05)
case .caption:
content
.font(.custom(CustomFontName.light.rawValue, size: 14))
.lineSpacing(16)
.kerning(0)
case .header:
content
.font(.custom(CustomFontName.extraBold.rawValue, size: 36))
.kerning(36 * 0.07)
}
}
}
- ViewModifer๋ฅผ ์์ฑํ์ฌ ๊ฐ ์คํ์ผ ๊ฐ์ด๋ ์ ์๋๋ก ์ ์ํด ์ค
- ํ๊ฐ ์ง์ ์ lineSpacing์ ์ฌ์ฉ
- ํผ๊ทธ๋ง์์๋ ํฐํธ์ ํฌ๊ธฐ + ํ๊ฐ
- Xcode์์๋ ๋จ์ ํ๊ฐ ํฌ๊ธฐ๋ง
- kerning์ ๊ฒฝ์ฐ px, % ๋ชจ๋ ๋์ ๊ฐ๋ฅํ๋ฉฐ %์ผ ๊ฒฝ์ฐ ํฐํธ์ฌ์ด์ฆ * ํผ์ผํธ
extension View {
func customFont(_ style: CustomFontStyle) -> some View {
self.modifier(CustomFontViewModifier(style: style))
}
}
- Text์์ modifier๋ฅผ ์ด์ฉํด์ ViewModifier๋ฅผ ๋๊ธฐ์ง ์๊ณ customFont๋ผ๋ ์ด๋ฆ์ผ๋ก ViewModifier๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ง์
VStack(spacing: 0) {
Group {
Text("์๋จ ํฐํธ์
๋๋ค.")
.customFont(.header)
.padding(.top, 32)
.multilineTextAlignment(.center)
Text("์บก์
์ ์ฃผ๋ก ์ค๋ช
ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค")
.customFont(.caption)
.multilineTextAlignment(.center)
.padding(.top, 5)
Text("๊ทธ๊ฑฐ ์์๋์? ์ฌ๋ฌ์ค๋ก ํ์๋๋ ํฐํธ๋ฅผ ๊ทธ๋ฆด ๋๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๋์์ธ๊ณผ ๋์ผํ๊ฒ ๊ทธ๋ฆฌ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? โจ๋์์ด๋์ ๊ฐ๋ฐ์ ๊ฐ์ ํ
์คํธ ์คํ์ผ์ ์ ์ํ๊ณ ๊ณต์ ํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ")
.multilineTextAlignment(.leading)
.customFont(.content)
.padding(.top, 40)
}
.frame(maxWidth: .infinity)
Spacer()
}
- ํ ์คํธ์ customFont modifier๋ฅผ ์ฌ์ฉํด์ ํผ๊ทธ๋ง์์ ์ง์ ํ style guide๋ฅผ ์ง์ ํด์ค
- ์ผ์ชฝ์ SwiftUI ์์ ํ๋ฉด, ์ค๋ฅธ์ชฝ์ ํผ๊ทธ๋ง ๊ฒฐ๊ณผ
- ํผ๊ทธ๋ง์์ ํ ์คํธ์ ์์ญ๊ณผ SwiftUI์ Text์ ์์ญ์ด ๋ค๋ฆ. SwiftUI์ Text๋ ํ ์คํธ์ ๋ฑ ๋ง๊ฒ ๋์ค์ง๋ง Figma๋ ํ ์คํธ ์์ญ์ ์ค๊ฐ์ ํ ์คํธ๊ฐ ์์นํด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์คํ์ ์ ๋์์ด๋์ ํจ๊ป ์ด์ผ๊ธฐ ํด์ ์ง์ ํ๋ ๊ฒ์ด ํ์
'iOS ๐ > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] ๊ฐ๋ก๋ชจ๋, ์ธ๋ก๋ชจ๋ ์ง์ํ๊ธฐ with @ViewBuilder (0) | 2023.09.20 |
---|---|
[SwiftUI] ViewBuilder ์์๋ณด๊ธฐ (0) | 2023.09.19 |
[SwiftUI] Link Text ๋ง๋ค๊ธฐ (๋ชจ๋ ๊ฑธ ์ค๋นํด ๋จ๋ค ๊ฐ์ ธ๋ค ์จ๋ผ!) (0) | 2023.08.27 |
[SwiftUI] bottom sheet ๋์ฐ๊ธฐ (0) | 2023.08.23 |
[SwiftUI] SwiftUI์์ AVKit ์ฌ์ฉํ๊ธฐ (0) | 2023.08.20 |