iOS 앱에 커스텀 폰트 추가하기

앱에 커스텀 폰트를 추가하고 앱 인터페이스에 사용하는 방법

Xcode 프로젝트에 폰트 추가

폰트를 Xcode에 추가하려면 메뉴에서 File > Add Files to "..."를 선택하거나 파인더에서 폰트를 드래그해서 Xcode 프로젝트로 드랍하여 추가한다.

트루 타입 폰트(.ttf) 또는 오픈 타입 폰트(.otf)를 사용할 수 있고, 폰트 파일이 앱의 타겟인지 확인한다.

폰트 파일 등록

폰트 파일을 프로젝트에 추가 한 후에는 Info.plistFonts provided by application를 키로(Raw Key값은 UIAppFonts) 폰트 파일을 등록 해야한다. 확장자를 포함하여 파일 이름을 배열에 등록한다.

Info.plist에 등록하지 않으면 사용할 수 없다.

커스텀 폰트를 인터페이스 빌더에서 사용

폰트 파일을 프로젝트에 추가하고 Info.plist에 등록한 다음 인터페이스 빌더의 속성 인스펙터에서 폰트를 설정하여 사용 할 수 있다.

소스 코드에서 커스텀 폰트 사용

소스 코드에서 커스텀 폰트의 인스턴스를 만들어서 사용하려면 폰트의 이름을 알아야 한다. 폰트의 이름은 대부분의 경우 폰트 파일의 이름과 일치하지 않는다. 폰트의 이름을 빠르게 확인하는 방법은 앱에서 사용할 수 있는 폰트의 목록을 가져오는 것이다.

for family in UIFont.familyNames.sorted() {
    let names = UIFont.fontNames(forFamilyName: family)
    print("Family: \(family) Font names: \(names)")
}

폰트의 이름을 확인 한 다음에는 UIFont의 인스턴스를 생성하여 사용할 수 있다.

예제 코드

[WWDC2019] macOS Mojave에서 Xcode 11 Playground로 SwiftUI 보기

WWDC 2019에서 발표한 SwiftUI를 사용해보기 위해서는 Xcode 11이 필요하고 macOS Catalina가 아니면 SwiftUI의 Canvas를 사용할 수가 없다. Canvas가 없으면 코드로 UIView를 한 땀 한 땀 만들때 처럼 매번 빌드해서 확인하는 수 밖에 없다. 😭…

그래서 비슷하게나마 해볼수 있는게 플레이그라운드의 liveView를 사용해서 뷰를 확인하면서 사용해보는 방법이 있다.

SwiftUI의 View를 liveView로 보기위해서는 UIHostingController를 사용하면 된다.

import UIKit
import PlaygroundSupport
import SwiftUI

struct ContentView: View {
    
    var body: some View {
        NavigationView {
            Group {
                Section {
                    List(0..<10) { item in
                        Text("\(item + 1)").font(.title).color(.green)
                    }.navigationBarTitle(Text("Title"))
                }
            }
        }
    }
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())

PlaygounrdSupport와 SwiftUI를 Import하고 View를 만든 다음 UIHostingController로 감싸서 PlaygroundPage의 liveView에 넣어주면 끝이다.

이렇게 뷰를 확인하면서 작성을 할 수 있지만 macOS Catalina 환경에서 SwiftUI의 Preview 모드를 사용하는 것과는 완전히 다르다. 될 수 있으면 APFS의 볼륨을 추가해서 macOS Catalina를 설치하고 듀얼로 사용하던지 여분의 맥을 준비해서 사용하는게 정신건강에 이롭다.

[WWDC2019] Swift Package Manager

지금까지는 Apple Platform 타겟 앱을 개발 할 때 의존성 패키지를 관리하기 위해서 서드 파티 패키지 관리자인 CocoaPods이나 Carthage를 사용해왔다.

WWDC 2019에서 애플은 Xcode 11에 Swift Package Manager를 통합 시키고 Apple Platform 타겟을 지원한다고 한다.

Xcode 11에서 Swift Package Manager 사용하기

Xcode 11의 프로젝트 설정 또는 File 메뉴를 보면 Swift Package 항목이 추가되어 있다.

Xcode의 프로젝트 설정
Xcode의 File 메뉴

하단의 + 버튼 또는 Add Package Dependency... 메뉴를 선택하면 Package Repository를 선택하는 창이 뜨고 GitHub, Bitbucket, GitLab의 계정을 Xcode에 설정해 놓았으면 개인 저장소가 하단 목록에 표시된다.

Package Repository 선택 화면

여기서는 Apple의 SwiftLog 패키지를 추가해보았다. 패키지를 추가하면 어떤 버전을 사용할 지 옵션을 지정할 수 있다.

Package 옵션 입력

끝으로 해당 패키지를 사용할 타겟과 패키지를 종류를 확인하고 마무리한다.

Package 추가 완료

이제 추가된 모듈을 코드에서 Import 하여 사용하면 된다.

import Logging

let logger = Logger(label: "com.jaemyeong.MyApp")
        
logger.info("Hello, world!")

[iOS] 홈 스크린 퀵 액션 추가하기

3D Touch를 지원하는 디바이스에서 홈 화면의 퀵 액션을 사용하여 앱의 자주 사용하는 기능을 액세스할 수 있다.

퀵 액션은 앱을 빌드 할 때 정적으로 또는 런타임에 동적으로 정의할 수 있다.

개인적으로는 좋아하는 기능인데 앞으로의 전망은 좋지 않다(iPhone XR은 기능이 빠졌으니)…

정적 퀵 액션 정의

앱에 사용할 퀵 액션이 변경되지 않는다면 Info.plist 파일에 정적 퀵 액션으로 정의하면 된다.

Info.plist 파일에 UIApplicationShortcutItems 키를 사용하여 정의하면 된다.

<key>UIApplicationShortcutItems</key>
<array>
	<dict>
		<key>UIApplicationShortcutItemType</key>
		<string>static</string>
		<key>UIApplicationShortcutItemTitle</key>
		<string>Static Quick Action</string>
	</dict>
</array>

홈 화면의 퀵 액션을 설정할 수 있는 Info.plist 파일의 다른 키 값은 Information Property List Key Reference에서 확인할 수 있다.

동적 퀵 액션 정의

UIApplication 인스턴스의 shortcutItems 속성을 UIApplicationShortcutItem 객체의 배열로 설정하여 홈 화면의 퀵 액션을 동적으로 구성할 수 있다.

홈 화면의 동적 퀵 액션은 언제든지 설정할 수 있다. 여기서는 applicationWillResignActive(_:) 메소드에서 설정한다.

func applicationWillResignActive(_ application: UIApplication) {
    application.shortcutItems = [
        UIApplicationShortcutItem(type: "dynamic", localizedTitle: "Dynamic Quick Action")
    ]
}

시스템이 화면에 맞는 항목 수만 표시하기 때문에 임의로 항목의 수를 제한할 필요는 없다.

퀵 액션에 응답하기

사용자가 홈 화면의 퀵 액션을 선택하면 다음 중 한 가지 방법으로 전달 된다.

  • 앱이 실행중이지 않으면 application(_:didFinishLaunchingWithOptions:) 메소드의 launchOptions 파라미터로 전달 된다.
  • 앱이 실행중이면 application(_:performActionFor:completionHandler:) 메소드가 호출된다.

참조