Как проверить, является ли UIFont системным шрифтом?

У меня есть следующий код для создания нескольких шрифтов.

UIFont* systemFont1 = [UIFont systemFontOfSize:12.0]; UIFont* systemFont2 = [UIFont boldSystemFontOfSize:12.0]; UIFont* systemFont3 = [UIFont italicSystemFontOfSize:12.0]; UIFont* customFont1 = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.0]; UIFont* customFont2 = [UIFont fontWithName:@"HelveticaNeue-Regular" size:12.0]; UIFont* customFont3 = [UIFont fontWithName:@"HelveticaNeue-Thin" size:12.0]; UIFont* customFont4 = [UIFont fontWithName:@"MyriadPro" size:12.0]; UIFont* customFont5 = [UIFont fontWithName:@"MyriadPro-Italic" size:12.0]; UIFont* customFont6 = [UIFont fontWithName:@"MyriadPro-Condensed" size:12.0]; 

Я хотел бы знать, какие системы UIFont являются системой. Мне практически нужен метод, который возвращает BOOL YES для переменных: systemFont1, systemFont2, systemFont3 и NO для customFont4 , customFont5 , customFont6 .

Поскольку Helvetica Neue является системным шрифтом на iOS7, это является предметом обсуждения, должно ли оно возвращать NO или YES в этих случаях, но для моей проблемы это было бы хорошо в любом случае.

Поэтому мой вопрос:

Как проверить, был ли экземпляр UIFont создан одним из методов системного шрифта?

Спасибо за помощь!

Вот ваш метод, который вы хотите:

 -(BOOL)isSystemFont:(UIFont *)font { return ([[font familyName] isEqualToString:[[UIFont systemFontOfSize:12.0f] familyName]])?YES:NO; } 

Или как расширение в Swift3

 extension UIFont { func isSystemFont() -> Bool { return self.familyName == UIFont.systemFont(ofSize: 12.0).familyName } } 

Вышеуказанный метод будет возвращаться по мере необходимости.

 if([self isSystemFont:systemFont1]) NSLog(@"SystemFont"); else NSLog(@"Custom Font"); if([self isSystemFont:customFont1]) NSLog(@"SystemFont"); else NSLog(@"Custom Font"); 

Выход

 2014-03-04 15:48:18.791 TestProject[4031:70b] SystemFont 2014-03-04 15:48:18.791 TestProject[4031:70b] Custom Font 

Просто проверьте имя шрифта и / или имя семейства?

 NSLog(@"Fontname: %@", systemFont1.fontName); NSLog(@"Familyname: %@", systemFont1.familyName); 

Я создал метод и протестировал его как в iOS 6, так и в iOS7 . Он работает нормально. Я получал результат, которого вы ожидаете.

Вот код:

 - (BOOL)isSystemFont:(UIFont*)pFont { NSLog(@"pFont-%@",pFont.familyName); // Object created for comparing system font with custom font UIFont *font = [UIFont systemFontOfSize:10]; NSLog(@"Font-%@",font.familyName); if ([pFont.familyName isEqualToString:font.familyName]) { return YES; } else { return NO; } } 

Надеюсь, это поможет вам.

Шрифты состоят не только из названия и размера. Вот более тщательная проверка. Предостережение: работает только на iOS 7.

 BOOL FontIsEqualToFont(UIFont *font1, UIFont *font2) { return [[[font1 fontDescriptor] fontAttributes] isEqual:[[font2 fontDescriptor] fontAttributes]]; } // use as follows: BOOL isSystemFont = FontIsEqualToFont(systemFont1, customFont1); 

Еще один хороший способ однозначно идентифицировать шрифты – использовать их имена postscript:

 BOOL fontsAreEqual = [[[font1 fontDescriptor] postScriptName] isEqualToString:[[font2 fontDescriptor] postScriptName]];