Пользовательское изображение UINavigationBar для iPhone 6/6+
У меня есть пользовательское изображение, созданное дизайнером для UINavigationBar. Я получил кусочки размером 640x128 и 640x88 для iPhone. Мои вопросы:
Если я скрываю строку состояния, я использую размер 640x88 или мне все еще нужно использовать 640x128,
Для iPhone 6/6+, а также для iPad я не знаю, как повторно использовать эти изображения, так как размер и соотношение сторон панели навигации отличаются.
К вашему сведению, изображение сделано с использованием градиента цветов сверху вниз (по оси Y). Даже если я использую растягиваемый UIImage, как мне решить проблему с панелью навигации разной высоты на каждом устройстве? Мне нужно ориентироваться на iOS 7 и выше.
3 ответа
Чтобы решить эту проблему, я просто создаю три разных изображения для iPhone 4/5/5s, iPhone 6 и iPhone 6 Plus. Разрешение изображения составляет 320x64, 375x64@2x, 414x64@3x (высота 64, поскольку мне нужно фоновое изображение для панели навигации + строка состояния)
Затем я применяю правильное изображение в приложении init:
NSString * navBarImageName;
if (IS_IPHONE_6P) {
navBarImageName = @"navBarBackground_iPhone6Plus";
} else if (IS_IPHONE_6) {
navBarImageName = @"navBarBackground_iPhone6";
} else {
navBarImageName = @"navBarBackground";
}
UIImage * navBarBackground = [UIImage imageNamed:navBarImageName];
[[UINavigationBar appearance] setBackgroundImage:navBarBackground forBarMetrics:UIBarMetricsDefault];
Вы можете попробовать это В заголовке вы можете определить макросы для разных устройств, таких как
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_IPHONE_6 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)
И тогда, если и еще условие для этого..
UIImageView *imageview;
if (IS_IPHONE_5){
imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 45)];
imageview.image=[UIImage imageNamed:@"yourimage" ];
[self.navigationController.navigationBar addSubview:imageview];}
else if(IS_IPHONE_6){
imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 375, 55)];
imageview.image=[UIImage imageNamed:@"select_albums6"];
}else if (IS_IPHONE_6_PLUS){
imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 414, 55)];
imageview.image=[UIImage imageNamed:@"select_albums6"];
} else
{
// 3.5 inch
imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 45)];
imageview.image=[UIImage imageNamed:@"select_album"];
}
а затем добавить навигационное подпредставление
[self.navigationController.navigationBar addSubview:imageview];
Примечание. Этот код записывается в методах ViewDidLoad и ViewWillAppear, поэтому для панели навигации задается пользовательский размер... Надеюсь, это поможет
Добавляя пользовательское изображение для фона NavigationBar, первое, о чем вы должны подумать - это размеры пользовательского изображения.
1) 320x44 => background.png
2) 640x88 => background@2x.png
3) 1334x183 => background@3x.png
Используйте следующий код, чтобы добавить фоновое изображение и избежать каких-либо плиток на фоновом изображении панели навигации.
[self.navigationController.navigationBar setBackgroundImage:[[UIImage imageNamed:@"background"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch] forBarMetrics:UIBarMetricsDefault];