Пользовательский стиль панели навигации-iOS [дубликат]
Возможные Дубликаты:
как добавить фоновое изображение на панели навигации iphone?
iOS-как NY Times сделал этот пользовательский стиль верхней панели навигации?
и если уж на то пошло, то нижний?
спасибо...
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 вместо 0. Это заставляет его появляться над собственным фоновым изображением, оставаясь ниже кнопки.
используйте 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]; }