Возможный дубликат:
Как добавить фоновое изображение на панель навигации iphone?
iOS - Как NY Times разработала этот собственный стиль верхней панели навигации?
И в этом отношении нижний?
Возможный дубликат:
Как добавить фоновое изображение на панель навигации iphone?
iOS - Как NY Times разработала этот собственный стиль верхней панели навигации?
И в этом отношении нижний?
EDIT: Это устарело; для iOS5 существует много лучший ответ ниже, by @Jenox.
Совершенно настраиваемый стиль для навигационных баров на удивление сложный. Лучшая запись, о которой я знаю, - это Себастьян Селис: http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/
Это не отменяет drawRect и содержит хорошее объяснение, почему это хорошо. Также обратите внимание, что вам не нужно следовать его учебнику. Вы можете скачать полный код здесь: https://github.com/scelis/ExampleNavBarBackground
Решение @ludwigschubert, однако, не работает на iOS 5. Также не работает переопределение -drawRect:
потому что оно даже не вызывается.
Начиная с iOS 5, панель навигации состоит из UINavigationBarBackground
и UINavigationItemView
. Есть два других способа заставить это работать.
Вставьте свой пользовательский вид изображения с индексом 1 вместо 0. Это заставит его появиться над фоновым фоновым изображением, оставаясь под кнопками.
Используйте протокол iOS 5 UIAppearance. Вы можете установить фоновое изображение для всех
[[UINavigationBar appearance] setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]
или только для одной панели навигации:
[navigationController.navigationBar setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]
Обязательно предоставьте два изображения (UIBarMetricsDefault и UIBarMetricsLandscapePhone) при разработке приложения для iPhone как для портретной, так и для альбомной ориентации.
Чтобы добавить к ответу @Jenox, если вы хотите поддерживать как iOS 4.xx, так и iOS 5.xx(т.е. ваш DeploymentTarget равен 4.xx), вы должны быть осторожны, обернув вызов внешний прокси, проверяя во время выполнения, если присутствует селектор "внешний вид" или нет.
Вы можете сделать это:
//Customize the look of the UINavBar for iOS5 devices
if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) {
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"NavigationBar.png"] forBarMetrics:UIBarMetricsDefault];
}
Вы также должны оставить обходное решение iOS 4.xx, которое вы, возможно, внедрили. Если вы применили обходной путь 'drawRect' для устройств iOS 4.xx, как упоминалось в @ludwigschubert, вы должны оставить это в:
@implementation UINavigationBar (BackgroundImage)
//This overridden implementation will patch up the NavBar with a custom Image instead of the title
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
Это приведет к тому, что NavBar будет выглядеть одинаково как на устройствах iOS 4, так и на iOS 5.
Скопируйте это в viewDidLoad. Он будет проверять iOS 5 и использовать предпочтительный метод, в противном случае он добавит subview в версии navBar для iOS, 5.0. Это будет работать при условии, что ваше пользовательское фоновое изображение не имеет прозрачных пленок.
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
NSLog(@"%f",version);
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"];
if (version >= 5.0) {
[self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
}
else
{
[self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1];
}
Вы можете просто создать категорию и создать собственный метод для добавления любого вида, которое вы хотите - изображения, кнопки, слайдеры. Например, вот код, который я использую - он добавляет пользовательский backgroundimage, backButton и Label.
@interface UINavigationBar (NavigationBar)
-(void)setBarForCard;
@end
@implementation UINavigationBar (NavigationBar)
-(void)setBarForCard
{
UIImageView *aTabBarBackground = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"BarImage"]];
aTabBarBackground.frame = CGRectMake(0,0,self.frame.size.width,44);
[self addSubview:aTabBarBackground];
[self sendSubviewToBack:aTabBarBackground];
[aTabBarBackground release];
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
backBtn.frame =CGRectMake(10, 8, 60, 30);
[backBtn addTarget:self action:@selector(back:)forControlEvents:UIControlEventTouchUpInside];
[backBtn setImage:[UIImage imageNamed: @"Back"] forState:UIControlStateNormal];
[self addSubview:backBtn];
UILabel *calendar = [[UILabel alloc]init];
calendar.frame = CGRectMake(105, 13, 109, 21);
calendar.text = @"Calendar"
calendar.textColor = [UIColor whiteColor];
calendar.textAlignment = UITextAlignmentCenter;
calendar.shadowColor = [UIColor grayColor];
calendar.shadowOffset = CGSizeMake(0, -1);
calendar.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20];
calendar.backgroundColor = [UIColor clearColor];
[self addSubview:calendar];
}
И затем в любом контроллере просмотра вы можете изменить свою навигационную панель, вызвав [self.navigationController.navigationBar setBarForCard];
Это работает как в IOS 4, так и IOS 5
Это лучший способ для iOS 5
if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
UIImage *image = [UIImage imageNamed:@"navBarImg.png"];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
вы можете изменить цвет оттенка панели навигации, чтобы изменить его цвет, а также вы можете использовать изображение в виде панели навигации. Для нижней панели я думаю, что они используют представление с тремя пользовательскими кнопками на нем.