2014-03-27 1 views
1

iOS 앱의 모든 라벨의 글꼴 군을 나중에 쉽게 변경할 수있는 방식으로 지정하려고합니다. Interface Builder를 거치지 않고 모든 화면의 모든 글꼴을 재설정해야하는 것을 원하지 않습니다. this post에 따르면, 필자는보기에서 모든 글꼴을 찾아 적절히 설정하는 방법을 만들었습니다.iOS에서 가벼운 글꼴 감지하기

필자의 경우 글꼴이 굵게, 기울임 꼴 또는 밝은 (예 : 스키니)인지에 따라 필자가 사용해야하는 몇 가지 글꼴 그룹이 있습니다. 이들은 모두 "OpenSans-Semibold.ttf", "OpenSans-Italic.ttf"및 "OpenSans-Light.ttf"와 같은 별도의 파일에 있습니다.

이상적으로는 Interface Builder에서 글꼴을 굵게, 기울임 꼴 또는 표시로 설정 한 다음 해당 .ttf 파일을 사용하여 코드 집합 만 재정의하도록 할 수 있습니다. this post에 따르면 글꼴을 굵게 또는 기울임 꼴로 설정했는지 여부를 쉽게 확인할 수 있지만 가볍거나 싫은 것이 작동하지 않는 것으로 판단됩니다.

가벼운 글꼴의 경우 "특성"값은 0x0이므로 플래그가 설정되지 않습니다. 가벼운 글꼴을 감지하는 다른 방법이 있습니까?

코드는 다음과 같습니다

- (void) setFontFamily:(UIView*)view 
{ 
    if([view isKindOfClass:[UILabel class]]) 
    { 
     UILabel* label = (UILabel*)view; 

     UIFontDescriptorSymbolicTraits traits = label.font.fontDescriptor.symbolicTraits; 
     BOOL bold = traits & UIFontDescriptorTraitBold; 
     BOOL italic = traits & UIFontDescriptorTraitItalic; 

     if(bold) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Semibold"size:label.font.pointSize]]; 
     else if(italic) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]]; 
     else if(light) 
      [label setFont:[UIFont fontWithName:@"OpenSans-Light"size:label.font.pointSize]]; 
     else 
      [label setFont:[UIFont fontWithName:@"OpenSans"size:label.font.pointSize]]; 
    } 

    for(UIView* subView in view.subviews) 
     [self setFontFamily:subView]; 
} 
+2

"빛"이 무엇인지 오해하고있을 가능성이 있습니까? 이탤릭체와 굵은 체는 _symbolic_ 형질입니다. "light"는 _weight_ 특성입니다. 코드에는 체중과 관련이 없습니다. – matt

+2

아, 죄송합니다. 한 가지 더 : iOS 7에서 UIFontDescriptor에 대해 알고 있습니까? 사용하는 것이 더 즐겁습니다. – matt

+0

나는 빛의 기술적 정의가 무엇인지에 대해 오해하고 있음이 틀림 없다. 대담한 체중 형질이 아니지만? 빛은 본질적으로 반대 방향으로 같은 것이다. 어쨌든 글꼴 체중과 관련된 API에는 아무 것도 표시되지 않습니다 (예 : CTFontWeightTraits는 없습니다). 그런 것이 있습니까? – d512

답변

1

의 특성에 따라 글꼴을 결정하는 당신의 전체 접근 방식은 문제가있다 :

else if(italic) 
    [label setFont: 
     [UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]]; 

당신은 하드 코딩 특성에 따라 글꼴 이름이다. 대신 런타임에 이름과 특성을 기반으로 글꼴을 요청하십시오. 어떤이, 길 산세의 이탤릭체 변형 경우이 매우 간단한 예제에서 나는, 글꼴 설치 무엇을 찾을 :이 코드가 유효한지

UIFont* f = [UIFont fontWithName:@"GillSans" size:15]; 
CTFontRef font2 = 
    CTFontCreateCopyWithSymbolicTraits (
     (__bridge CTFontRef)f, 0, nil, 
     kCTFontItalicTrait, kCTFontItalicTrait); 
UIFont* f2 = CFBridgingRelease(font2); 

참고 아이폰 OS 7 만 CTFontRef 및 UIFont이 무료 어디에 서로 다리를 맞 춥니 다. 이론적으로 UIFontDescriptor를 통해 C 함수없이이 작업을 수행 할 수 있어야합니다.하지만 마지막으로 보았을 때 모든 글꼴 (예 : 길 샌 (Gill Sans))에서 작동하지 않습니다.

당신이해야 할 일은 다음과 같습니다. 시작 글꼴의 기호 및 무게 특성을 결정한 다음 런타임에서 요구 사항에 가장 가까운 글꼴을 런타임에 요청하십시오.

관련 문제