개발하면서 겪었던 문제들을 공유하고 기록하고 싶습니다.
Tuist로 개발하는 동안 UI 모듈을 공유했습니다.
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)
}
}
색상이 아무것도 표시되지 않는 것을 볼 수 있습니다.
앱을 실행하면 메인으로 시작하고 리소스를 로드하면 기본적으로 메인 패키지에서 리소스를 가져오려고 합니다.
그러나 UI 모듈은 프레임워크가 다르고 자체 식별자가 있으며 main과 다른 번들을 사용합니다.
모듈을 만들 때
대상을 만들 때 모든 것을 정의했습니다.
UI 번들의 색상에 액세스하려면 UI 번들 ID를 사용하십시오.
아래와 같이 코드를 작성하면
색상이 정상적으로 나오는 것을 볼 수 있습니다.
public extension Color {
static var nsColor: Color {
Color("nsColor", bundle: Bundle(identifier: "ns.NSWorkspace.UI"))
}
}
UI 모듈에서 글꼴을 정의하고 사용하는 방법
뿐만 아니라 글꼴
잘썼다 잘썼다
실제로 구현된 UI를 보면 글꼴이 전혀 없고 혐오스러워 보이는 경우를 발견할 수 있습니다.
먼저 글꼴이 드래그 앤 드롭으로 프로젝트 파일에 저장되고 plist가 설정되어 있다고 가정합니다.
for family in UIFont.familyNames.sorted() {
let names = UIFont.fontNames(forFamilyName: family)
print("Family: \(family) Font names: \(names)")
}
먼저 위의 코드를 실행
글꼴이 존재합니다
이름을 올바르게 사용하고 있는지 확인해야 합니다.
파일 이름과 내부에서 사용하는 이름은 다를 수 있습니다.
폰트가 제대로 적용되었다면
이렇게 로그인
“프레텐다드 레귤러”라고 적혀있어요
사용하는 경우 이 문자열을 그대로 붙여넣어야 합니다.
하지만
UI 모듈에서 글꼴 정의
메인 모듈에서 사용하는 경우
폰트가 적용되지 않는 현상을 볼 수 있습니다
위 코드로 로그를 만들어도 안보이네요.
번들로 액세스하여 글꼴을 가져올 수 없습니다.
어떻게 지내세요…?
방법이 있었다
CTFontManagerRegisterFont~~~ 기능이 있습니다.
코어텍스트…!
글꼴 관리자에 글꼴을 등록합니다.
여러 개 중 하나를 선택했는데 ~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 함수를 실행함으로써
모든 폰트를 등록하여 정상적으로 사용 가능
참조