2014-10-29 1 views
4

대담한 글꼴 UI 이름을 가진 UIFont을 얻는 데 사용하려는 방법은 일부 글꼴에서만 작동하는 것 같습니다. (아이폰 OS 8.1 시뮬레이터)일부 iOS 글꼴 모음이 UIFontDescriptorTraitBold를 지원하지 않는 이유는 무엇입니까?

UIFont* font = [UIFont fontWithName:@"TimesNewRomanPS-BoldMT" size:12]; 
NSLog(@"A: Font name: %@", [font fontName]); 

// desired method works for Helvetica Neue 
UIFontDescriptor *desc = [[UIFontDescriptor alloc] init]; 
desc = [desc fontDescriptorWithFamily:@"Helvetica Neue"]; 
desc = [desc fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; 
font = [UIFont fontWithDescriptor:desc size:12]; 
NSLog(@"B: Font name: %@", [font fontName]); 

// desired method fails for Times New Roman 
desc = [[UIFontDescriptor alloc] init]; 
desc = [desc fontDescriptorWithFamily:@"Times New Roman"]; 
NSLog(@"desc: %@", desc); 
desc = [desc fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; 
NSLog(@"desc bold: %@", desc); 

인쇄 : 예를 들어

A: Font name: TimesNewRomanPS-BoldMT 
B: Font name: HelveticaNeue-Bold 
desc: UICTFontDescriptor <0x7f9be0d05e80> = { NSFontFamilyAttribute = "Times New Roman"; } 
desc bold: (null) 

이 버그, 아니면 그것은 (실제로는 대담한 변형이있는) 모든 글꼴 가족을 위해 작동하도록 설계되지 않는 이유는 무엇입니까? 나는 정말로 "굵게"또는 그런 것을 찾으려는 글꼴 이름을 분석하도록 강요 받기를 원하지 않는다.

+0

나는이 fontDescriptorWithSymbolicTraits의 또 다른 피해자입니다. iOS7의 모든 글꼴에서 완벽하게 작동했기 때문에 부끄러운 일이었습니다. 그 동안 임시 해결책을 찾았습니까? 나는 "-Black | -Bold | -Italic | -Oblique"에 대한 글꼴 이름을 구문 분석하고 싶지 않습니다. – Bluezen

답변

4

이것은 버그입니다. fontDescriptorWithSymbolicTraits:은 폰트 기술자를 돌려주는 것이 보증되고 있습니다. 따라서 nil을 반환하는 것은 예기치 않은 동작입니다. 당신은 스위프트와 같은 일을 다시하는 경우 desc은 선택하지 않기 때문에

는 사실, 그것은 충돌의 원인이됩니다

var desc = UIFontDescriptor() 
desc = desc.fontDescriptorWithFamily("Times New Roman") 
desc = desc.fontDescriptorWithSymbolicTraits(.TraitBold) 
println(desc); //crash 

UIFontDescriptorUIFont 별도의 질문은 반환 여부. 레이다 파일을 보내야합니다. neural5torm @

+0

감사! 이 문제에 대한 버그 보고서 18812268을 제출했습니다. – devx

+0

@devx Apple이이 문제를 해결 했습니까? 나도 같은 문제가있어. . – Micrified

+1

이것은 아마도 iOS 10 SDK/Swift 2.3/Xcode 8에서 변경되었습니다. 'UIFontDescriptor' 헤더를 살펴보면 다음과 같이 나타납니다 :'public func fontDescriptorWithSymbolicTraits (symbolicTraits : UIFontDescriptorSymbolicTraits) -> UIFontDescriptor? // 동일한 기호가있는 특성을 가진 동일한 패밀리의 새 글꼴 설명자 참조를 반환하거나, 시스템에 없으면 nil을 반환합니다. '따라서 fontDescriptorWithSymbolicTraits는 더 이상 글꼴 설명자를 반환하지 않습니다. –

1

이 iOS8의 버그에 좋은 해결 방법을 제공합니다 :

NSString *fontFamily = @"Arial"; 
BOOL isBold = YES; 
BOOL isItalic = YES; 
CGFloat fontSize = 20.0; 
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes: 
    @{ 
     @"NSFontFamilyAttribute" : fontFamily, 
     @"NSFontFaceAttribute" : (isBold && isItalic ? @"Bold Italic" : (isBold ? @"Bold" : (isItalic ? @"Italic" : @"Regular"))) 
    }]; 
UIFont *font = [UIFont fontWithDescriptor:fontDescriptor size:fontSize]; 

원본 게시물 : 버그 : https://stackoverflow.com/a/26222986/3160700