Почему шрифты отображаются неправильно в iOS 4

В предыдущем посте мы добавили свой шрифт ttf или otf к проекту, чтобы наше приложение отличалось от других. И допустим, вы добавили в свое приложение три шрифта TruthCYR-Regular, TruthCYR-Bold и TruthCYR-Thin. Затем давайте сделаем три UILabel и попробуем отобразить все эти три шрифта у нас на экране.

label1.text = [NSString stringWithString:@"Тут какой-то текст"];
label1.font = [UIFont fontWithName:@"TruthCYR-Regular" size:19.0f];
label2.text = [NSString stringWithString:@"Тут какой-то текст"];
label2.font = [UIFont fontWithName:@"TruthCYR-Bold" size:19.0f];
label3.text = [NSString stringWithString:@"Тут какой-то текст"];
label3.font = [UIFont fontWithName:@"TruthCYR-Thin" size:19.0f];

Запустим проект в симуляторе iOS 5 — все выглядит прекрасно, как мы и хотели.

Но наше приложение должно работать, например, минимум на iOS 4.3. Запускаем приложение в этом симуляторе и видит странное — текст отображается неправильно.

А произошло следующее. В iOS 4 есть ограничение, по которому могут отображаться только два шрифта одной Family. В данном случае у нас Family —  это TruthCYR и в нее входит три шрифта. Но берется только два последних — вот они и отображаются. Более того, в одном из проектов, где я хотел использовать хотя бы два шрифта в UITableViewCell, по каким-то причинам у меня не получилось использовать два шрифта, а только один из семейства. Что же нам сделать, чтобы наше приложение работало и в iOS 5 и iOS 4? Мы берем любую программу для правки шрифтов, какая у вас есть. Я скачивал бесплатную Type light 3.0 и в ней чуть-чуть меняем название Family. Это делается в меню Font -> Names. Я поменял TruthCYR на TruthCR и тоже самое сделал в Preferred Family, которая доступна, если нажать кнопочку Advanced в этом окне Names. Сохраняем наш шрифт под другим именем и добавляем в проект.

Теперь сделаем маленькое лирическое отступление. Я покажу код, по которому можно получить весь список шрифтов, доступный вашему приложению.

// List all fonts on iPhone
NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
NSArray *fontNames;
NSInteger indFamily, indFont;
for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
{
  NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
  fontNames = [[NSArray alloc] initWithArray:
  [UIFont fontNamesForFamilyName:
  [familyNames objectAtIndex:indFamily]]];
  for (indFont=0; indFont<[fontNames count]; ++indFont)
  {
    NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
  }
  [fontNames release];
}
[familyNames release];

Если мы вставим этот кусок кода в наш проект, то увидим, что так как мы поменяли название семейства то и название шрифта тоже немного изменилось. Ну и конечно, как мы и хотели, в семействе TruthCYR осталось два шрифта, а в новом семействе TruthCR появился всего один шрифт TruthCR-Regular. Немного меняем код для label1

label1.font = [UIFont fontWithName:@"TruthCR-Regular" size:19.0f];

и теперь и в iOS 4 и 5 у нас экран выглядит одинаково.

Реклама

Программирование рекламных баннеров iAd

Я тут зарегистрировался на Хабре. Вернее дело было так. Я решил написать статью про использование новой iAd framework, чтобы можно было добавлять рекламу в приложения для iPhone. Статью разместил в Песочнице Хабра и меня (спасибо им) заинвайтили.

Пост называется: Добавляем рекламные баннеры iAd в ваши приложения для iPhone

Кратко план поста такой:

  1. Что такое iAd и с чем ее едят.
  2. Создание ADBannerView в вашем приложении
  3. Изменения баннер в зависимости от ориентации телефона
  4. Реализация скрытия баннера, если реклама недоступна.
  5. Что надо отключить в вашем приложении, если вы решили показать рекламу. А потом — включить.