내용 정리
이번 프로젝트에서는 별도의 폰트를 사용하기 때문에 프로젝트에 폰트를 추가하고, 이를 편히 사용할 수 있도록 메소드를 구현해보자.
프로젝트에 커스텀 폰트를 추가하기 위해서는 우선 폰트 파일을 프로젝트에 삽입해 주어야 한다.

이 때, 폰트 파일의 형식은 otf와 ttf 형식이 가장 호환이 좋다.
파일만 추가해서는 폰트를 사용할 수 없다. 프로젝트의 info.plist에 폰트를 설정 해줘야만 폰트를 사용할 수 있다.
먼저 info.plist에 Fonts provided by application 속성을 추가해준 후 아이템을 추가하여 폰트의 파일명을 적어준다.

이 때 중요한 것은 폰트 파일의 확장자명까지 모두 적어주어야 한다는 점이다.
이제 폰트를 사용할 수는 있지만 지금은 폰트를 사용하기 위해서 아래의 형식을 사용해야 한다.
let test = UILabel()
test.text = "test"
test.font = UIFont(name: "SCDream1", size: 16)
이렇게 하면 매번 폰트를 입력할 때마다 name을 입력해줘야 하기 때문에 불편하다.
때문에 UIFont에 extension으로 커스텀 폰트를 사용할 수 있는 메소드를 구현하려고 한다.
먼저 커스텀 폰트의 사이즈를 정의하는 enum 타입을 정의해준다.
extension UIFont {
enum FontSize: CGFloat {
case caption = 10
case body = 12
case headline = 14
case display = 16
case title = 24
case subtitle = 20
}
}
위에서 정의한 폰트 사이즈를 가지고 커스텀 폰트의 사이즈를 정의할 수 있도록 할 것이다.
다음으로 커스텀 폰트를 사용하여 UIFont 타입을 반환하는 메소드를 구현해준다.
static func SCDream(size fontSize: FontSize, weight: UIFont.Weight) -> UIFont {
let familyName = "SCDream"
var weightString: String
switch weight {
case .black:
weightString = "9"
case .bold:
weightString = "7"
case .heavy:
weightString = "8"
case .ultraLight:
weightString = "2"
case .light:
weightString = "3"
case .medium:
weightString = "5"
case .regular:
weightString = "4"
case .semibold:
weightString = "6"
case .thin:
weightString = "1"
default:
weightString = "4"
}
return UIFont(name: "\(familyName)\(weightString)", size: fontSize.rawValue) ?? .systemFont(ofSize: fontSize.rawValue, weight: weight)
}
위의 메소드에서는 커스텀 폰트가 동일하게 가지는 이름인 familyName을 정의해주고, 파라미터로 들어온 weight에 따라 weightString의 값이 바뀌어 UIFont 타입의 형태로 반환해주는 로직을 가진다.
위의 메소드는 아래와 같이 사용할 수 있다.
let test = UILabel()
test.text = "test"
test.font = UIFont.SCDream(fontSize: .title, weight: .bold)
아까보다 정확성도 높아지고 사용하기 편해진 것을 알 수 있다.
위의 방식으로 구현했을 때, 실제로 빌드를 돌려보니 폰트가 적용이 안 되어있는 것을 확인할 수 있었다.
방식에 문제는 없었는데... 아마 폰트의 이름이 다르게 입력되어 있는 것 같았다.
static func printAll() {
familyNames.sorted().forEach { familyName in
print("*** \(familyName) ***")
fontNames(forFamilyName: familyName).sorted().forEach { fontName in
print("\(fontName)")
}
}
}
위의 코드를 UIFont의 extension에 구현하여 사용하면 프로젝트에 등록된 모든 폰트의 이름을 확인할 수 있다.
이 메소드를 이용하여 폰트 명을 확인해보니...

내가 메소드에 입력한 폰트 명과 실제 프로젝트에 적용된 폰트 명이 다른 것을 확인할 수 있었다.
문제를 확인했으니 이제 메소드를 고쳐주면 된다.
static func SCDream(size fontSize: FontSize, weight: UIFont.Weight) -> UIFont {
let familyName = "S-CoreDream-"
var weightString: String
switch weight {
case .black:
weightString = "9Black"
case .bold:
weightString = "7ExtraBold"
case .heavy:
weightString = "8Heavy"
case .ultraLight:
weightString = "2ExtraLight"
case .light:
weightString = "3Lihgt"
case .medium:
weightString = "5Medium"
case .regular:
weightString = "4Regular"
case .semibold:
weightString = "6Bold"
case .thin:
weightString = "1Thin"
default:
weightString = "4Regular"
}
return UIFont(name: "\(familyName)\(weightString)", size: fontSize.rawValue) ?? .systemFont(ofSize: fontSize.rawValue, weight: weight)
}
이제 빌드를 해보면 무사히 폰트가 적용된 것을 확인할 수 있다.

이것 때문에 프로젝트에 hotFix를 해야했다...
앞으로 커스텀 폰트를 적용할 일이 있으면 꼭 테스트를 해보고, 이름을 잘 확인한 뒤 진행해야겠다고 생각했다.
커스텀 폰트가 예쁘긴 해...