-Today's Learning Content-

  • CustomFont

1. CustomFont를 적용하기

내용 정리

이번 프로젝트에서는 별도의 폰트를 사용하기 때문에 프로젝트에 폰트를 추가하고, 이를 편히 사용할 수 있도록 메소드를 구현해보자.

1) 폰트 파일 추가하기

프로젝트에 커스텀 폰트를 추가하기 위해서는 우선 폰트 파일을 프로젝트에 삽입해 주어야 한다.

이 때, 폰트 파일의 형식은 otfttf 형식이 가장 호환이 좋다.

2) info.plist 수정하기

파일만 추가해서는 폰트를 사용할 수 없다. 프로젝트의 info.plist에 폰트를 설정 해줘야만 폰트를 사용할 수 있다.

먼저 info.plistFonts provided by application 속성을 추가해준 후 아이템을 추가하여 폰트의 파일명을 적어준다.

이 때 중요한 것은 폰트 파일의 확장자명까지 모두 적어주어야 한다는 점이다.

3) 폰트 메소드 구현하기

이제 폰트를 사용할 수는 있지만 지금은 폰트를 사용하기 위해서 아래의 형식을 사용해야 한다.

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)

아까보다 정확성도 높아지고 사용하기 편해진 것을 알 수 있다.

4) 폰트 적용 안됨

위의 방식으로 구현했을 때, 실제로 빌드를 돌려보니 폰트가 적용이 안 되어있는 것을 확인할 수 있었다.
방식에 문제는 없었는데... 아마 폰트의 이름이 다르게 입력되어 있는 것 같았다.

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)
    }

이제 빌드를 해보면 무사히 폰트가 적용된 것을 확인할 수 있다.

5) 결론

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


-Today's Lesson Review-

커스텀 폰트가 예쁘긴 해...
profile
이유있는 코드를 쓰자!!

0개의 댓글