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];
К сожалению, это не сработает. Если у кого-нибудь есть какие-то предложения, я все уши!
Ответы
Ответ 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;