반갑습니다 집주인들 팀원 박효준입니다 !
본 편에서는 모듈화가 적용되어 있는 저희 프로젝트에서
다른 모듈의 폰트를 사용하고 싶으면 어떻게 하는 지 알아보도록 하겠습니다!!!
그럼 레쯔고 〰️
문제 상황
우리 팀은 Multiple Project를 통한 모듈화를 진행하였다.
그리고 앱 내에서 사용되는 폰트는 단 한 가지, “OwnglyphBerry”을 사용하고 있다.
Excutable 모듈인 MHApplication
모듈에서 plist에 적용하면 폰트 적용이 잘 되나, 모듈의 역할 상으로 Presentation에서 하는게 맞다.
그러나, MHPresentation
모듈에서 폰트를 Plist에 넣고 관리하면 모듈마다 Bundle이 다르기 때문에 MHApplication에서 MHPresentation의 번들을 읽을 수 없어 Plist를 가져올 수 없다.
그렇기 때문에 다른 모듈이 갖고 있는 Font를 어떻게 다른 모듈에서 적용하는지 알아보겠다.
문제 해결
개요
먼저 MHPresentation에 폰트를 넣어서 저장하고, plist에 다음과 같이 추가한다.
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string>OwnglyphBerry.ttf</string>
</array>
</dict>
</plist>
MHApplication이 저 폰트를 앱에 등록하여 사용하기 위해 MHPresentation의 Bundle에 찾아가서 폰트가 저장된 URL을 찾아야 한다.
그리고 그 경로를 CTFontManagerRegisterFontsForURL
에 등록해줘야 한다!
CTFontManagerRegisterFontsForURL
CoreText 프레임워크,
UIKit 안에 있기 때문에 따로 Import 안 해줘도 된다.
func CTFontManagerRegisterFontsForURL(
_ fontURL: CFURL, // Bundle 내의 폰트가 존재하는 URL
_ scope: CTFontManagerScope, // 수명 정의
_ error: UnsafeMutablePointer<Unmanaged<CFError>?>? // 에러 처리
) -> Bool
폰트 매니저로써 폰트를 등록시켜준다..!
위 메소드를 호출하면 url이 유효한 경우, Bundle에 있는 폰트가 등록되고 정상적으로 사용할 수 있게 된다.
1번만 호출해주면 되는데 AppDelegate 혹은 SceneDelegate에서 호출해주면 될듯 하다.
우리는 MHPresentation에 UIFont를 확장하여 static 메소드를 넣어주었고,
해당 메소드는 HomeViewController
가 있는 곳의 번들을 찾아서 OwnglyphBerry.ttf 폰트를 찾아 URL을 갖는다.
이후 CTFontManagerRegisterFontsForURL에 넣어주어 등록할 수 있게 한다.
해당 메소드를 AppDelegate에서 위 메소드를 호출하여 폰트가 등록되도록 처리하였다.
깔-끔
배운 점
- Image와 Color 같은 Assets도 비슷한 방법이겠지만, 모듈화 되어있는 상태에서 Bundle을 잘 읽어들이는 것이 중요하다는 것을 알았다.
- 모듈화된 환경에서 다른 모듈의 폰트 적용을 하려면 어떤 과정을 밟아야 하는지 알게 되었다.
- CTFontManagerRegisterFontsForURL을 알게되어 폰트 적용을 어떻게 하는지 알았다.
참조 링크
https://developer.apple.com/documentation/coretext/1499468-ctfontmanagerregisterfontsforurl
'Xcode' 카테고리의 다른 글
협업할 때 인덴션 꿀팁~ (0) | 2024.11.28 |
---|---|
멀티 프로젝트 모듈화와 SwiftLint 환경에서 빌드 속도 개선 (0) | 2024.11.20 |
[모듈화 3편] 우리의 최종 모듈화 (feat. Multiple Project) (0) | 2024.11.12 |
[모듈화 2편] Dynamic Library vs Static Library (0) | 2024.11.11 |
[모듈화 1편] Library vs Framework (3) | 2024.11.10 |