Пользовательский стиль панели навигации-iOS [дубликат]


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

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

и если уж на то пошло, то нижний?

спасибо...

7   53  

7 ответов:

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. вставьте свой пользовательский вид изображения в 1 вместо 0. Это заставляет его появляться над собственным фоновым изображением, оставаясь ниже кнопки.

  2. используйте iOS 5's 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.ХХ устройств, как упомянутый @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 и использовать предпочтительный метод, в противном случае он добавит подвид в navBar для версий iOS

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];
}

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