[Swift] 분리된

개발하면서 겪었던 문제들을 공유하고 기록하고 싶습니다.

Tuist로 개발하는 동안 UI 모듈을 공유했습니다.


[Swift] 분리된 1

UI가 분리되어 있기 때문에

자원에 따라

이미지, 색상 및 글꼴과 같은 요소는 UI 모듈에서 정의됩니다.

나는 그것을 다른 곳에서 제거하는 데 사용합니다.

위 이미지를 기반으로

기능에서

평소와 같이 UI를 가져와 사용하는 경우

실행 오류 없음

요청한 자원을 확보할 수 없음을 알 수 있습니다.

그 이유는

프레임이었기 때문에

번들이 분리되어 있기 때문입니다.

먼저 색상과 이미지를 정렬합니다.

요약하면 색상 및 이미지 솔루션은 동일합니다.

번들을 검색하고 가져오는 방법입니다.

우선 일반적으로 UI 모듈에 정의된 색상에 접근할 때

아래와 같이 로그를 볼 수 있습니다.

기본 패키지의 자산 카탈로그에서 “nsColor”라는 색상을 찾을 수 없습니다.

// UI모듈
public extension Color {
    static var nsColor: Color { Color("nsColor") }
}

// Main 모듈
struct MainView: View {
    var body: some View {
        VStack {
            Color.nsColor.frame(height: 100)
            Text("Hello, World!
") } .border(.red) } }


[Swift] 분리된 2

색상이 아무것도 표시되지 않는 것을 볼 수 있습니다.

앱을 실행하면 메인으로 시작하고 리소스를 로드하면 기본적으로 메인 패키지에서 리소스를 가져오려고 합니다.

그러나 UI 모듈은 프레임워크가 다르고 자체 식별자가 있으며 main과 다른 번들을 사용합니다.

모듈을 만들 때

대상을 만들 때 모든 것을 정의했습니다.


[Swift] 분리된 3

UI 번들의 색상에 액세스하려면 UI 번들 ID를 사용하십시오.

아래와 같이 코드를 작성하면

색상이 정상적으로 나오는 것을 볼 수 있습니다.

public extension Color {
    static var nsColor: Color {
        Color("nsColor", bundle: Bundle(identifier: "ns.NSWorkspace.UI"))
    }
}


[Swift] 분리된 4

UI 모듈에서 글꼴을 정의하고 사용하는 방법

뿐만 아니라 글꼴

잘썼다 잘썼다

실제로 구현된 UI를 보면 글꼴이 전혀 없고 혐오스러워 보이는 경우를 발견할 수 있습니다.

먼저 글꼴이 드래그 앤 드롭으로 프로젝트 파일에 저장되고 plist가 설정되어 있다고 가정합니다.

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

먼저 위의 코드를 실행

글꼴이 존재합니다

이름을 올바르게 사용하고 있는지 확인해야 합니다.

파일 이름과 내부에서 사용하는 이름은 다를 수 있습니다.


[Swift] 분리된 5

폰트가 제대로 적용되었다면

이렇게 로그인

“프레텐다드 레귤러”라고 적혀있어요

사용하는 경우 이 문자열을 그대로 붙여넣어야 합니다.

하지만

UI 모듈에서 글꼴 정의

메인 모듈에서 사용하는 경우

폰트가 적용되지 않는 현상을 볼 수 있습니다

위 코드로 로그를 만들어도 안보이네요.

번들로 액세스하여 글꼴을 가져올 수 없습니다.

어떻게 지내세요…?

방법이 있었다


[Swift] 분리된 6

CTFontManagerRegisterFont~~~ 기능이 있습니다.


[Swift] 분리된 7

코어텍스트…!

글꼴 관리자에 글꼴을 등록합니다.

여러 개 중 하나를 선택했는데 ~ForURL 함수가 입력값입니다.

URL: 글꼴이 있는 URL

범위: 수명을 정의

프로세스 – 세션 기간 동안 사용 가능

영구 – 레지스트리를 공유하지 않으면 계속 사용할 수 있습니다.

이렇게 생겼어요

글꼴이 정의되고 쓰여졌기 때문에

유형을 순회할 때

UI 모듈 팩에 액세스하여

각 글꼴 파일의 URL 가져오기

이것은 등록을 통해 할 수 있습니다

public extension Font {
    enum PretendardWeight: String, CaseIterable {
        case regular = "Pretendard-Regular"
        case medium = "Pretendard-Medium"
        case semiBold = "Pretendard-SemiBold"
        case bold = "Pretendard-Bold"
        case black = "Pretendard-Black"
    }
    
    static func pretendard(size: CGFloat, weight: PretendardWeight = .regular) -> Font {
        .custom(weight.rawValue, size: size)
    }
    
    static func registerFont() {
        Font.PretendardWeight.allCases.forEach {
            guard let url = Bundle.uiBundle?.url(forResource: "\($0.rawValue)", withExtension: ".otf"),
                  CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) else {
                print("fail register font")
                return
            }
        }
    }
}

그런 다음 AppDelegate 또는

시작점에 첫 번째 글꼴 등록

registerFont 함수를 실행함으로써

모든 폰트를 등록하여 정상적으로 사용 가능

참조

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