Пользовательский фон для проблем с панелью UINavigationBar
-
07-07-2019 - |
Вопрос
Мне удалось добавить пользовательский фон к моей панели навигации, используя:
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];
Это работает нормально, и я вижу заголовок и кнопки в порядке.Однако, когда я детализирую один уровень, а затем возвращаюсь к корню, кнопки скрыты, но заголовок по-прежнему виден.Похоже, что изображение панели навигации закрывает элементы кнопок.
Я в замешательстве, поскольку вставляю его внизу, поэтому я бы предположил, что при нажатии на элементы навигации они отображаются над другими представлениями на панели навигации.
Есть какие-нибудь идеи?
Спасибо,
Майк
Решение
Следуя описанию из здесь, Я предлагаю добавить категорию в навигационную панель.
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
// Drawing code
UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);
}
@end
Другие советы
На iOS 5 это не сработает, но хорошей новостью является то, что есть простой способ сделать это
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
ПРИМЕЧАНИЕ:Это будет работать только на iOS 5 и выше, поэтому обязательно проверьте версию iOS, если хотите обеспечить обратную совместимость.
Вложенные просмотры NavigationBar постоянно меняются, я имею в виду, что каждый просмотр появляется / исчезает, поэтому вам не следует ожидать, что добавленный imageview будет иметь индекс 0 массива вложенных просмотров.
Вы могли бы попробовать добавить это в viewDidAppear (в каждом viewcontroller, который управляет элементами навигации /:):
NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);
for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
[[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}
NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);
Я использовал Хауек решение но когда панель имеет другой вкус в других контроллерах, это может вызвать некоторые незначительные проблемы, в любом случае, это не лучший вариант.
Надеюсь, это поможет, по крайней мере, понять, почему то, что вы делали, не сработало,
Вместо того, чтобы делать это в Нарисовать правильно: вы можете переопределить Растягивающий текст:InContext: метод в классе категории UINavigationBar.Внутри Растягивающий текст:InContext: таким образом, вы можете нарисовать фоновое изображение, которое вы хотите использовать.Также вы можете выбрать разные изображения для портретной и альбомной ориентации интерфейса, если ваше приложение поддерживает несколько ориентаций интерфейса.
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
return;
}
UIImage *image = (self.frame.size.width > 320) ?
[UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
CGContextClip(context);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
Этот полный демонстрационный проект Xcode настройка внешнего вида UINavigationBar также может быть полезной.
Далее приведен способ, которым вы можете просто добавить новый фон к вашей панели UINavigationBar.
/////////
UINavigationController *navController = [[UINavigationController alloc] init];
UINavigationBar*bar=[navController navigationBar]; // get navigation bar
NSArray*barSubview=[bar subviews]; // get all subviews of bar
UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
backView.alpha=0.0f;// set alpha to 0 and it will become invisible
UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
imgView.frame=CGRectMake(0, 0, 320, 44);
[bar insertSubview:imgView atIndex:0];// and it will be out new background
[imgView release];