Skip to content

[기술공유] 모듈화 환경에서 다른 모듈의 Font를 사용하기

박효준 edited this page Nov 14, 2024 · 1 revision

문제 상황

우리 팀은 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 안 해줘도 된다.

스크린샷 2024-11-14 오후 11 21 12
func CTFontManagerRegisterFontsForURL(
    _ fontURL: CFURL, // Bundle 내의 폰트가 존재하는 URL
    _ scope: CTFontManagerScope, // 수명 정의
    _ error: UnsafeMutablePointer<Unmanaged<CFError>?>? // 에러 처리
) -> Bool

폰트 매니저로써 폰트를 등록시켜준다..!

위 메소드를 호출하면 url이 유효한 경우, Bundle에 있는 폰트가 등록되고 정상적으로 사용할 수 있게 된다.

1번만 호출해주면 되는데 AppDelegate 혹은 SceneDelegate에서 호출해주면 될듯 하다.

스크린샷 2024-11-14 오후 11 21 24

우리는 MHPresentation에 UIFont를 확장하여 static 메소드를 넣어주었고,

해당 메소드는 HomeViewController 가 있는 곳의 번들을 찾아서 OwnglyphBerry.ttf 폰트를 찾아 URL을 갖는다.

이후 CTFontManagerRegisterFontsForURL에 넣어주어 등록할 수 있게 한다.

스크린샷 2024-11-14 오후 11 21 36

해당 메소드를 AppDelegate에서 위 메소드를 호출하여 폰트가 등록되도록 처리하였다.

스크린샷 2024-11-14 오후 11 22 00

깔-끔


배운 점

  • Image와 Color 같은 Assets도 비슷한 방법이겠지만, 모듈화 되어있는 상태에서 Bundle을 잘 읽어들이는 것이 중요하다는 것을 알았다.
  • 모듈화된 환경에서 다른 모듈의 폰트 적용을 하려면 어떤 과정을 밟아야 하는지 알게 되었다.
  • CTFontManagerRegisterFontsForURL을 알게되어 폰트 적용을 어떻게 하는지 알았다.

참조 링크

https://developer.apple.com/documentation/coretext/1499468-ctfontmanagerregisterfontsforurl

https://minsone.github.io/ios/mac/ios-register-custom-font

https://nsios.tistory.com/196

Clone this wiki locally