UINavigationBar со сплошным цветом iOS 5

Я использую категорию для настройки панели навигации. Мой код:

- (void) drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColor(context, CGColorGetComponents([self.tintColor CGColor]));
    CGContextFillRect(context, rect);
}

Это работает хорошо, но не в iOS 5. Мне нужно, чтобы цвет навигационной панели был сплошным без какого-либо градиента. Как мне это сделать?

Как я знаю, для iOS 5 единственный способ заменить drawRect метод заключается в создании подкласса, но есть ли способ заставить все контроллеры навигации использовать UINavigationBar подкласс вместо оригинального класса?

3 ответа

Решение

В iOS 5 вы можете использовать протокол UIAppearance для настройки внешнего вида всех UINavigationBars в вашем приложении. Ссылка: ссылка.

Я получил сплошной цвет, чтобы создать собственное изображение для панели навигации и установить его в качестве фона UINavigationBars. Возможно, вам придется создать изображение с тем же размером, что и UINavigationBar, по крайней мере, это то, что я сделал.

В делегате приложения сделайте что-то вроде этого:

UIImage *image = [UIImage imageNamed:@"navbarbg.png"];
[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

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

@interface AppDelegate : UIResponder <UIApplicationDelegate, UIAppearanceContainer>

@end

Вы, вероятно, можете добиться того же, установив какой-то цвет или что-то вместо изображения. Но я обнаружил, что это простое решение.

Это касается как iOS 5, так и iOS 4.3 и более ранних версий.

https://gist.github.com/1774444

Это больше взломать и постоянно работает для меня. Это должно быть в файле AppDelegate.

//Create  a size struct.
CGSize size = CGSizeMake(768, 50);

//CReate a imagecontext from a non-existing image. You can use a existing image as well, in that case the color will be the color of the image. 
UIImage *backgroundImage = [UIImage imageNamed:@"nonexist.png"];

UIGraphicsBeginImageContext(size);

[backgroundImage drawInRect:CGRectMake(0,0,size.width,size.height)];

UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

self.navigationController = [[UINavigationController alloc]initWithRootViewController:self.viewController];

Установите цвет фона на ваш выбор.

[self.navigationController.view setBackgroundColor:[UIColor blackColor]];

self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

//Most important line.
[navigationController.navigationBar setBackgroundImage: newImage forBarMetrics:UIBarMetricsDefault];
Другие вопросы по тегам