Подтвердить что ты не робот

Custom nav bar styling - iOS

Возможный дубликат:
Как добавить фоновое изображение на панель навигации iphone?

iOS - Как NY Times разработала этот собственный стиль верхней панели навигации?

И в этом отношении нижний?

ny-times

4b9b3361

Ответ 1

EDIT: Это устарело; для iOS5 существует много лучший ответ ниже, by @Jenox.

Совершенно настраиваемый стиль для навигационных баров на удивление сложный. Лучшая запись, о которой я знаю, - это Себастьян Селис: http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/

Это не отменяет drawRect и содержит хорошее объяснение, почему это хорошо. Также обратите внимание, что вам не нужно следовать его учебнику. Вы можете скачать полный код здесь: https://github.com/scelis/ExampleNavBarBackground

Ответ 2

Решение @ludwigschubert, однако, не работает на iOS 5. Также не работает переопределение -drawRect: потому что оно даже не вызывается.
Начиная с iOS 5, панель навигации состоит из UINavigationBarBackground и UINavigationItemView. Есть два других способа заставить это работать.


  1. Вставьте свой пользовательский вид изображения с индексом 1 вместо 0. Это заставит его появиться над фоновым фоновым изображением, оставаясь под кнопками.

  2. Используйте протокол iOS 5 UIAppearance. Вы можете установить фоновое изображение для всех

[[UINavigationBar appearance] setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]

или только для одной панели навигации:

[navigationController.navigationBar setBackgroundImage:myImage forBarMetrics:UIBarMetricsDefault]

Обязательно предоставьте два изображения (UIBarMetricsDefault и UIBarMetricsLandscapePhone) при разработке приложения для iPhone как для портретной, так и для альбомной ориентации.

Ответ 3

Чтобы добавить к ответу @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.

Ответ 4

Скопируйте это в 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];
}

Ответ 5

Вы можете просто создать категорию и создать собственный метод для добавления любого вида, которое вы хотите - изображения, кнопки, слайдеры. Например, вот код, который я использую - он добавляет пользовательский 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

Ответ 6

Это лучший способ для iOS 5

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
 UIImage *image = [UIImage imageNamed:@"navBarImg.png"];
 [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}

Ответ 7

вы можете изменить цвет оттенка панели навигации, чтобы изменить его цвет, а также вы можете использовать изображение в виде панели навигации. Для нижней панели я думаю, что они используют представление с тремя пользовательскими кнопками на нем.