2013-07-01 2 views
10

Насколько мне известно, шрифт по умолчанию для iOS 7 по умолчанию - Helvetica Neue UltraLight, который намного тоньше по сравнению с его смелым предшественником. Чтобы обеспечить согласованный дизайн и сделать мои ближайшие приложения одинаковыми во всех распространенных версиях iOS, я бы хотел использовать Helvetica Neue UltraLight в качестве основного (основного) шрифта приложения.iOS 7 и Helvetica Neue UltraLight: используйте по умолчанию для старых версий iOS

Охотно, этот «новый шрифт» доступен since iOS version 5.0, так что это уже поддерживается до версии прошивки 7. К сожалению, единственный способ, которым я понял, чтобы использовать его, чтобы вручную вызвать [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:size] на шрифте каждого UIView, который является утомительной и подверженной ошибкам несогласованности.

Итак, мой вопрос: каков ваш способ сделать это или как вы справляетесь с этим изменением дизайна?

+12

Одна вещь, которую нужно учитывать - пользователям iOS 6 нужны приложения, которые выглядят как iOS 6. Пользователи iOS 7 хотят, чтобы приложения выглядели как iOS 7. Лично я считаю, что ваше приложение должно использовать шрифт iOS 6 по умолчанию при работе под iOS 6. То же самое со значками. Но это всего лишь одно мнение. – rmaddy

+4

Я думаю, что это хорошая идея, чтобы ассимилировать элементы iOS7 в текущем приложении iOS 6, но только, если общая «тема» позволяет это.Таким образом, необязательно должна быть совершенно другая версия для 6 и 7, по крайней мере, до тех пор, пока большинство пользователей не установит 7. – brainray

+0

@rmaddy: Я думаю, вы совершенно правы, по крайней мере для большинства пользователей. Тем не менее, это будет означать дополнительные расходы по дизайну и обслуживанию, поэтому я бы хотел дать этот «общий взгляд» попробовать – Mobiletainment

ответ

18

Вот решение Objective-C Runtime:

@interface UIFont (CustomSystemFont) 

+ (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize; 
+ (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize; 
+ (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize; 

@end 
@implementation UIFont (CustomSystemFont) 

+ (void)load 
{ 
    Method orig = class_getClassMethod([UIFont class], @selector(systemFontOfSize:)); 
    Method swiz = class_getClassMethod([UIFont class], @selector(ln_systemFontOfSize:)); 
    method_exchangeImplementations(orig, swiz); 

    orig = class_getClassMethod([UIFont class], @selector(boldSystemFontOfSize:)); 
    swiz = class_getClassMethod([UIFont class], @selector(ln_boldSystemFontOfSize:)); 
    method_exchangeImplementations(orig, swiz); 

    orig = class_getClassMethod([UIFont class], @selector(italicSystemFontOfSize:)); 
    swiz = class_getClassMethod([UIFont class], @selector(ln_italicSystemFontOfSize:)); 
    method_exchangeImplementations(orig, swiz); 
} 

+ (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) 
    { 
     //Call original implementation. 
     return [self ln_systemFontOfSize:fontSize]; 
    } 

    return [UIFont fontWithName:@"HelveticaNeue" size:fontSize]; 
} 

+ (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) 
    { 
     //Call original implementation. 
     return [self ln_systemFontOfSize:fontSize]; 
    } 

    return [UIFont fontWithName:@"HelveticaNeue-Medium" size:fontSize]; 
} 

+ (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) 
    { 
     //Call original implementation. 
     return [self ln_systemFontOfSize:fontSize]; 
    } 

    return [UIFont fontWithName:@"HelveticaNeue-Italic" size:fontSize]; 
} 

@end 

Что мне делать в этом примере заменить три метода системного шрифта с моей и тест, чтобы увидеть, если системная версия - 7 или выше. Если это так, я использую оригинальные методы, в противном случае возвращаю шрифт по своему выбору (в данном случае Helvetica Neue с весом UltraLight для регулярных и курсивных запросов и средний вес для жирных запросов).

Это работает для всего, что генерируется в коде, включая созданные системой представления. Он не работает при загрузке представлений из файлов Xib и Storyboard, поскольку шрифты жестко закодированы в самом файле NIB. С помощью подборщика шрифтов выберите нужный шрифт.

+0

Очень интересно. Мое невежество: я собираю метод 'load' вызывается каждый раз, когда создается объект UIFont. Кто, или какой код называет этот метод? Это какой-то побочный эффект Objective-C? – zontar

+0

Метод load вызывается, когда класс загружается средой Objective C, обычно во время запуска приложения (точнее, при загрузке динамической библиотеки, которая находится во время запуска в iOS). –

+0

Возможно, вы захотите использовать префикс для своих категорий, если они столкнутся с внутренними методами в 'UIFont'. –

4

Не нарушая NDA, указав конкретные имена методов - почему бы не объявить категорию в UIFont, чтобы имитировать новые методы для динамического типа?

+1

На самом деле это не вопрос: как установить шрифт по умолчанию для приложения «Helvetica Neue UltraLight». Цель состоит не в том, чтобы имитировать новый динамический тип, просто установите шрифт по умолчанию. – rmaddy

+0

Хм. Я подумал, что это касается части об использовании fontWithName: каждый раз утомительно и подвержен ошибкам. –

+0

Вы говорили о репликации некоторых новых методов в категории. Как это скажет приложению использовать данный шрифт во всем приложении? – rmaddy

11

Почему бы просто не использовать API внешнего вида?

[[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:14.0]]; 

UIAppearance API

+0

Свойство 'font'' UILabel' не помечено как селектор 'UIAppearance'. Я не думаю, что это сработает. – rmaddy

+0

Нет, это решение работает очень хорошо. – ArtFeel

+2

Это не очень хорошо работает, если у вас есть метки, которым нужен другой шрифт _sizes_. Это решение действительно применимо только в тривиальных приложениях. – CrimsonChris

3

Для тех, кто ищет решение в раскадровки, у меня был некоторый успех, открывающий файл раскадровки в текстовом редакторе и выполняющий поиск/замену. Вы должны поймать каждый тип шрифта, который вы хотите изменить (например, жирный/курсив), но я был в состоянии заменить стандартный системный шрифт с HelveticaNeue сверхлегкой замены:

key="fontDescription" type="system" 

с

key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" 

для смелых, вы бы заменить:

key="fontDescription" type="boldSystem" 

Я решил заменить свои смелые шрифты с тем же UltraLight шрифтом, но и для тех, кто хочет «смелый» лечение вы можете выбрать «HelveticaNeue-Thin».

Я рекомендую использовать контроль версий или сделать резервную копию вашего файла, прежде чем делать это!

Смежные вопросы