-
[iOS] SPM Package 등에서 커스텀 폰트 (Custom Font) 추가하기/iOS 📱 2026. 1. 28. 02:37반응형
2026.01.28 - [/iOS 📱] - [iOS] 커스텀 폰트 (Custom Font) 추가하기
기존 Bundle(main) Resource 에 등록하여 info.plist 와 매핑하여 가져왔지만, 특정 패키지에 종속 되는 경우에는 프로젝트 Copy Bundle Resources 에 없기 때문에 위 링크 된 기존 방식으로는 Package에서 리소스를 추가했을 때, 인식하지 못하게 됩니다.
1. 폰트 준비
TTF는 애플에서, OTF는 마이크로소프트에서 개발된 저장 방식이라고 합니다.
2. 리소스 추가

다운로드 받은 폰트를 Resource 폴더에 추가합니다.
3.
info.plist 추가코드를 통해 동적으로 추가CTFontManagerRegisterGraphicsFont is deprecated
더보기public enum FontManager { private static var registeredFonts: Set<String> = [] /// 폰트가 필요할 때마다 자동으로 등록하는 함수 public static func registerFontIfNeeded(_ fontName: String) { // 이미 등록된 폰트는 스킵 guard !registeredFonts.contains(fontName) else { return } // Bundle.module에서 폰트 파일 찾기 guard let fontURL = findFontURL(for: fontName) else { print("⚠️ Font file not found for: \(fontName)") return } // 폰트 등록 guard let fontData = NSData(contentsOf: fontURL), let provider = CGDataProvider(data: fontData), let font = CGFont(provider) else { print("⚠️ Failed to create CGFont for: \(fontName)") return } var error: Unmanaged<CFError>? if CTFontManagerRegisterGraphicsFont(font, &error) { registeredFonts.insert(fontName) print("✅ Font registered: \(fontName)") } else if let error = error?.takeRetainedValue() { print("⚠️ Font registration failed for \(fontName): \(error)") } } /// Bundle.module에서 폰트 파일 URL 찾기 private static func findFontURL(for fontName: String) -> URL? { let extensions = ["otf", "ttf"] for ext in extensions { if let url = Bundle.module.url(forResource: fontName, withExtension: ext) { return url } } return nil } /// 모든 Pretendard 폰트를 한번에 등록하는 함수 (옵션) public static func registerAllFonts() { let fontNames = [ "GeekbleMalang2", "Pretendard-Regular", "Pretendard-Medium", "Pretendard-SemiBold", ] fontNames.forEach { registerFontIfNeeded($0) } } }CTFontManagerRegisterFontsForURL
// ⚠️ Swift6 사용시 @MainActor 표기 public enum FontManager { private static var registeredFonts: Set<String> = [] /// 폰트가 필요할 때마다 자동으로 등록하는 함수 public static func registerFontIfNeeded(_ fontName: String) { // 이미 등록된 폰트는 스킵 guard !registeredFonts.contains(fontName) else { return } // Bundle.module에서 폰트 파일 찾기 guard let fontURL = findFontURL(for: fontName) else { print("⚠️ Font file not found for: \(fontName)") return } var error: Unmanaged<CFError>? // 폰트 등록 if CTFontManagerRegisterFontsForURL(fontURL as CFURL, .process, &error) { registeredFonts.insert(fontName) print("✅ Font registered: \(fontName)") } else if let error = error?.takeRetainedValue() { print("⚠️ Font registration failed for \(fontName): \(error)") } } /// Bundle.module에서 폰트 파일 URL 찾기 private static func findFontURL(for fontName: String) -> URL? { let extensions = ["otf", "ttf"] for ext in extensions { if let url = Bundle.main.url(forResource: fontName, withExtension: ext) { print("find url in main: \(url)") } if let url = Bundle.module.url(forResource: fontName, withExtension: ext) { print("find url in module: \(url)") return url } } print("⚠️ Font file not found for: \(fontName)") return nil } /// 모든 Pretendard 폰트를 한번에 등록하는 함수 (옵션) public static func registerAllFonts() { let fontNames = [ "GeekbleMalang2", "Pretendard-Regular", "Pretendard-Medium", "Pretendard-SemiBold", ] fontNames.forEach { registerFontIfNeeded($0) } } }등록 된 폰트를 확인하고 싶다면 아래 코드를 사용하면 된다.
for family in UIFont.familyNames.sorted() { let names = UIFont.fontNames(forFamilyName: family) print("Family: \(family) Font names: \(names)") } // Family: Pretendard Font names: ["Pretendard-Regular", "Pretendard-Medium", "Pretendard-SemiBold"]# 참고자료
https://developer.apple.com/documentation/uikit/adding-a-custom-font-to-your-app
Adding a Custom Font to Your App | Apple Developer Documentation
Add a custom font to your app and use it in your app’s interface.
developer.apple.com
반응형' > iOS 📱' 카테고리의 다른 글
[iOS] 커스텀 폰트 (Custom Font) 추가하기 (0) 2026.01.28 [iOS] MultipeerConnectivity(P2P 프로토콜) 소개 및 예제 프로젝트 (1) 2025.05.12 [UIKit] iOS 앱 화면 밝기 조정하기 (0) 2025.02.13 [UIKit] UIKit의 스토리보드 Preview 적용하기(Storyboard, Preview, 미리보기) (0) 2024.12.08 [iOS] Meet AccessorySetupKit 정리 (0) 2024.06.14