SSAC iOS 앱 개발자 데뷔과정 - 23

Sangwon Shin·2021년 11월 1일
0

SSAC

목록 보기
18/19

🖋 Custom Font

Xcode 에서 제공하는 Font 이외의 다른 Font를 적용하려면 어떻게 해야할까요?

우선, Custom Font 를 적용시킬 때 두 가지를 고려해야 합니다.

  • 저작권
  • 용량

저작권은 당연히 조심해야겠죠..

Font 의 용량 때문에 앱의 크기가 커질 수 있기 때문에 특정 로고에서만 사용되는 Font 의 경우, Font가 포함된 이미지를 포함시키는 경우도 있습니다.

또한, Custom Font 를 사용할 경우 사용자가 입력하는 텍스트가 존재하지 않을 수 있기 때문에 조심해야 합니다!

❗️용량을 줄이기 위해서 의도적으로 사용자들이 거의 사용하지 않는 글자를 지우는 경우도 있습니다


Custom Font 를 적용시켜 보겠습니다.
눈누 사이트에서 마음에 드는 Font 를 다운로드 받습니다. (.otf , .ttf)

해당 파일들을 Xcode 프로젝트에 Embed 시킵니다.
Create ref 설정하면 폰트 파일을 다운로드 받은 경로를 참조해서 가져옵니다.

info.plist 파일에서 사용할 폰트 파일을 등록합니다. (확장자명까지)

Build Phases 에 폰트 파일이 등록되어 있는지 확인!

여기까지 적용하고 난 후에, 우리가 추가한 폰트를 사용하려고 하면 오류가 납니다 🥲

이는, 폰트의 파일명과 폰트명은 다를 수 있기 때문입니다!

for family in UIFont.familyNames {
            print(family)

            for sub in UIFont.fontNames(forFamilyName: family) {
                print("=======> \(sub)")
            }
        }

폰트명을 매번 확인하기 힘들기 때문에 extension 을 이용해서 연산 프로퍼티로 설정해서 사용합니다!


🌍 Localization

우리가 앱을 출시할 때 언어, 문화권이 다른 환경에서 사용할 수 있도록 지원하려면 어떻게 해야 할까요?

동일한 기능을 하는 앱을 언어별로 새롭게 만들게 되면 너무 비효율적이겠죠?

그래서 우리는 다른 나라에서도 서비스를 지원하기 위해서는 앱을 국제화 시켜야합니다. (사용자들에 따라 현지화)

우선, 앱에서 사용되는 각 문자열들을 어떻게 지역화 시킬 수 있는지 알아보겠습니다.


1 ) Storyboard Object ID 이용

이렇게 설정하면 기존의 있던 객체들에 대해서는 object ID 가 자동으로 생성됩니다.

각각의 객체들에 각 국가에 맞는 문자열을 저장하면 됩니다!

만약 새로운 뷰객체를 추가한 경우에는 위와 같이 Object ID 를 확인하고 직접 추가해야 합니다.


2 ) Localizable.strings 이용

❗️❗️❗️파일명 주의

Localizable 이라는 파일명의 strings 파일을 생성합니다.
인스펙터 영역에서 Localize 를 통해서 기본 다국어를 생성할 수 있습니다. ❗️1)에서 설정했던 Localization 을 지원할 언어가 옵션으로 나옵니다

//English
"tab_home" = "HOME";
"tab_search" = "Search";
"tab_calendar" = "Calendar";
"tab_setting" = "Setting";
"welcome_text" = "Hello! Nice to meet you!";
"tab_home" = "홈";
"tab_search" = "검색";
"tab_calendar" = "캘린더";
"tab_setting" = "설정";
"welcome_text" = "안녕하세요~! 반갑습니다!";

위와 같이 각 나라에 맞는 텍스트를 저장합니다.

welcomLabel.text = NSLocalizedString("welcome_text", comment: "")

그리고 NSLocalizedString 을 통해 현지화된 strings 파일의 key 값을 읽어와 다국어를 지원합니다.
휴대폰의 기본 언어 설정에 따라 변경되는 것을 확인할 수 있습니다.

//extension
var localized: String {
        get {
            return NSLocalizedString(self, comment: "")
        }
    }

위와 같이 localized 연산 프로퍼티를 설정하고 String 구조체에 extension 으로 추가합니다.

enum LocalizableStrings: String {
    
    //case welcome_text
    case tab_home
    case tab_search
    case tab_calendar
    case tab_setting
    case data_backup
    case welcome_text
    
    var localized: String {
        return self.rawValue.localized()
    }
}

그리고 위와같이 열거형을 우리가 Localizable.strings 에서 사용했던 string 값으로 구성합니다.
string 값을 동일하게 설정하면 rawValue 를 통해 바로 연산가능

그리고 localized 연산 프로퍼티를 통해 각 열거형 case에 해당하는 현지화된 strings 파일을 key 값을 반환하도록 설정합니다.

welcomLabel.text = "welcome_text".localized
welcomLabel.text = LocalizableStrings.welcome_text.localized

string 파일이 많아질 수록 이런식으로 관리하는게 더 효과적이겠죠??

❗️strings 파일명을 다르게 설정한 경우에는 어떻게 적용하나요?

backupLabel.text = NSLocalizedString("data_backup", tableName: "Setting", bundle: .main, value: "", comment: "")

와 같이 tableName 을 해당 파일명으로 작성하면 설정할 수 있습니다!


3 ) InfoPlist.strings

앱 내에서 사용자의 위치나 사진에 접근할 때 사용자에게 접근을 허용해달라고 설정했었습니다.

이때 사용된 문자열들도 각 나라에 해당하는 언어로 설정해주는 과정이 필요합니다.

하지만 이런 하드웨어, 개인정보 보호 권한 문구의 경우에는Localizable.strings 을 통해서 설정할 수 없습니다.
Apple API에 의해 정의된 Key 를 사용해 구현해야 합니다!

Info.Plist - Open as Source Code 를 통해서 확인 할 수 있습니다.

//InfoPlist.strings
CFBundleDisplayName = "MY DIARY";
NSCameraUsageDescription = "Please Access Camera";

CFBundleDisplayName = "나의 일기장";
NSCameraUsageDescription = "사진 권한을 허용해주세요";

❗️ Key를 사용해서 설정하기 때문에 문자열 처럼 " " 로 묶어주지 않아도 됩니다.

InfoPlist.string 말고 파일명을 다르게 할 경우는 어떻게 될까요?
-실험해보고 블로그에 정리하겠습니다.

🏷 P.S.

오늘 과제를 위해서 Storyboard Reference 를 이용했는데 분명 1~2 주 전에 한번 다뤘었던거 같은데... 하면서 기억이 안나 찾아보면서 하느라 시간이 좀 걸렸던것 같습니다.

또 헷갈려서 방황할 미래의 저를 위해 간단하게 적어놓겠습니다.

Relationship Segue으로 설정하기
Tab Bar item -> 새로운 Storyboard 의 VC 에 추가하기

그리고, 오늘 배운 다국어 처리를 tab bar item 들에 적용할 경우 처음 화면이 나오는 시점에서 모두 처리가 되어 있어야 하기 때문에 처음 화면이 나오는 건 Home.Storyboard 의 VC 이기 때문에 해당하는 VC 의 ViewDidLoad 에서 다국어 처리를 설정해야 합니다!

각 VC에서 다국어 처리를 하게 되면 탭 버튼을 모두 눌러야 적용됩니다.

깃허브에서 오늘 내용을 확인할 수 있습니다.

동기, 비동기, process, thread 는 제 나름대로 생각이 정리되는 시점에서 블로그에 정리해서 올리도록 하겠습니다!
profile
개발자가 되고싶어요

0개의 댓글