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

UINavigationBar setBackgroundImage: forBarMetrics: не работает

Я просто переключился на 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];

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

4b9b3361

Ответ 1

Чтобы применить 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 не подключено ни к чему.

Ответ 2

Ответ 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

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

UINavigationController * navigationController = [self navigationController];
UINavigationBar * nb = [navigationController navigationBar];

Ответ 4

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

    [[UIToolbar appearance] setBackgroundImage:[UIImage imageNamed:@"NavBarDarkWoodGrain.png"] forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];

Ответ 5

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

См. мой ответ здесь для поддержки обеих версий ОС.

Ответ 6

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

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;