Фоновое изображение UINavigationBar имеет неправильный размер после изменения ориентации на iPhone 5

Длинное название, надеюсь, небольшая проблема.

У меня есть UINavigationBar с пользовательским фоновым изображением. Мое приложение будет поддерживать как альбомную, так и портретную ориентацию. Пейзаж хорошо работает в симуляторе для экранов с диагональю 3 дюйма и без сетчатки. Однако на 4-дюймовом экране Retina фоновое изображение отображается в два раза больше в ландшафтном режиме.

Вот соответствующий фрагмент кода из метода инициализации моего пользовательского навигационного контроллера:

[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-bg.png"] forBarMetrics:UIBarMetricsDefault];        
if (IS_IPHONE_5)
{
    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-bg-landscape-iphone5.png"] forBarMetrics:UIBarMetricsLandscapePhone];
}
else
{
    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar-bg-landscape.png"] forBarMetrics:UIBarMetricsLandscapePhone];
}

IS_IPHONE_5 — это макрос, определяемый как:

#define WIDTH_IPHONE_5 568
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds].size.height == WIDTH_IPHONE_5)

Вот 2 фрагмента экрана, которые могли бы объяснить ситуацию более понятно. Когда приложение открывается в портретном режиме, все в порядке:

портрет

Все взрывается при переходе в ландшафтный режим:

пейзаж

Размеры изображения (в пикселях, ширина x высота) для альбомной версии фонового изображения:

  • navbar-bg-landscape.png: 480x44
  • [email protected]: 960x88
  • navbar-bg-landscape-iphone5.png: 1136x88

Или это может быть проблема только симулятора? (У меня сейчас нет настоящего iPhone 5)


person verhage    schedule 09.10.2012    source источник
comment
Почему вы не используете метод - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode для использования одного изображения для iphone/ipone5/ipad?   -  person Nekto    schedule 10.10.2012
comment
Потому что я не знал, что он существует :) Кажется многообещающим, может сработать в моей ситуации. Мне кажется, этот метод полезен только в том случае, если изменение размера не искажает изображение...   -  person verhage    schedule 10.10.2012


Ответы (1)


Я считаю, что ваш navbar-bg-landscape-iphone5.png на самом деле должен называться [email protected] и что вы должны продолжать ссылаться на него как navbar-bg-landscape-iphone5.png в своем коде. Поскольку у iPhone 5 есть дисплей Retina, iOS будет искать версию @2x и использовать ее. Если он не найдет его, он будет использовать версию, которую вы упомянули, а затем увеличит ее в 2 раза. Чтобы избежать 2-кратного масштабирования iOS, присвойте ему версию @2x.

person vacawama    schedule 09.10.2012
comment
Да! Я знал, что это было что-то маленькое, что я упустил из виду. Вы, сэр, герой ;) - person verhage; 10.10.2012