UINavigationBar setBackgroundImage: forBarMetrics: не работает - PullRequest
13 голосов
/ 14 октября 2011

Я только что переключился на iOS 5, и в моем приложении все работает, кроме пользовательской панели навигации. Я огляделся и последовал совету всех о вызове новых методов setBackgroundImage: forBarMetrics: однако, похоже, он не работает. Вот код, который я пытался разместить как в делегате приложения, так и в методе viewDidLoad некоторых контроллеров представления:

UINavigationBar *nb = [[UINavigationBar alloc]init];
if( [nb respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] )
{
    UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
    [nb setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
[nb release];

К сожалению, это не работает. Если у кого-то есть какие-либо предложения, я весь в ушах!

Ответы [ 6 ]

44 голосов
/ 14 октября 2011

Чтобы применить image ко всем панелям навигации, используйте прокси внешнего вида:

[[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

Для отдельной панели:

// Assuming "self" is a view controller pushed on to a UINavigationController stack
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

В вашем примере фоновое изображение выигралоне меняется, потому что nb ни к чему не подключен.

4 голосов
/ 09 ноября 2011

Ответ от rob правильный, но если приложение работает на iOS 4.3 или ниже, приложение вылетает.Таким образом, вы можете реализовать это как

if([[UINavigationBar class] respondsToSelector:@selector(appearance)]) //iOS >=5.0
{
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigationBar.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBar-Landscape.png"] forBarMetrics:UIBarMetricsLandscapePhone];   

}

Это позволит установить изображение для режима Пейзаж и Портрет

3 голосов
/ 20 октября 2011

Обратите внимание, что если вы хотите применить то же самое к панели инструментов, это немного отличается. Вот пример, основанный на ответе Роба:

    [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"NavBarDarkWoodGrain.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];
3 голосов
/ 14 октября 2011

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

UINavigationController * navigationController = [self navigationController];
UINavigationBar * nb = [navigationController navigationBar];
0 голосов
/ 19 января 2013

Это сработало для меня.

UIView *parentViewLeft = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
parentViewLeft.backgroundColor = [UIColor clearColor];

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar.png"]
                                                  forBarMetrics:UIBarMetricsDefault];    
} else {
    UIImageView* imgBG = [[UIImageView alloc]init];
    imgBG.image = [UIImage imageNamed:@"navbar.png"];
    imgBG.frame = CGRectMake(-10,0, 330, 44);
    [parentViewLeft addSubview:imgBG];
}

UIBarButtonItem *customBarButtomLeft = [[UIBarButtonItem alloc] initWithCustomView:parentViewLeft];
self.navigationItem.leftBarButtonItem = customBarButtomLeft;
0 голосов
/ 01 октября 2012

Вы не делали что-то вроде использования подкласса UINavigationBar? Если вы сделаете это и переопределите drawRect: на iOS5 и выше, все сломается.

См. Мой ответ здесь , чтобы узнать о способах поддержки обеих версий ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...