UINavigationBar subexibição está escondendo o UIBarButtonItem direita
-
06-07-2019 - |
Pergunta
No controlador raiz mesa de vista que eu adicionar um subexibição que mantém uma imagem:
[self.navigationController.navigationBar addSubview:imageView];
Então, em um controlador de exibição de tabela filho que eu empurro para a pilha eu definir um UIBarButtonItem direita:
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightAction:)];
self.navigationItem.rightBarButtonItem = rightButton;
[rightButton release];
Eu não posso entender por que o botão não é exibido na barra de navegação. Se eu tap (o espaço em branco) a rightAction:. Método é invocado então o botão "está" lá, esperar que ele não é exibido
Eu tentei enviar o subexibição imageView para trás na barra de navegação, mas sem sucesso. É algo que faz sentido uma vez que o botão na verdade pertencem ao UINavigationItem de qualquer maneira ...
Alguém sabe como posso fazer essa visualização do botão corretamente?
Update: o botão Voltar for exibido corretamente, mas ele é adicionado pelo sistema embora ...
Solução
A melhor maneira de adicionar uma imagem para um UINavigationBar
é a subclasse-lo ou fazer uma categoria e substituir o método drawRect
:
// #Lighter r,g,b,a #Darker r,g,b,a
#define MAIN_COLOR_COMPONENTS { 0.153, 0.306, 0.553, 1.0, 0.122, 0.247, 0.482, 1.0 }
#define LIGHT_COLOR_COMPONENTS { 0.478, 0.573, 0.725, 1.0, 0.216, 0.357, 0.584, 1.0 }
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
if (imageReady) {
UIImage *img = [UIImage imageNamed: @"navigation_background.png"];
[img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
} else {
// Render yourself instead.
// You will need to adjust the MAIN_COLOR_COMPONENTS and LIGHT_COLOR_COMPONENTS to match your app
// emulate the tint colored bar
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat locations[2] = { 0.0, 1.0 };
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGFloat topComponents[8] = LIGHT_COLOR_COMPONENTS;
CGGradientRef topGradient = CGGradientCreateWithColorComponents(myColorspace, topComponents, locations, 2);
CGContextDrawLinearGradient(context, topGradient, CGPointMake(0, 0), CGPointMake(0,self.frame.size.height/2), 0);
CGGradientRelease(topGradient);
CGFloat botComponents[8] = MAIN_COLOR_COMPONENTS;
CGGradientRef botGradient = CGGradientCreateWithColorComponents(myColorspace, botComponents, locations, 2);
CGContextDrawLinearGradient(context, botGradient,
CGPointMake(0,self.frame.size.height/2), CGPointMake(0, self.frame.size.height), 0);
CGGradientRelease(botGradient);
CGColorSpaceRelease(myColorspace);
// top Line
CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, self.frame.size.width, 0);
CGContextStrokePath(context);
// bottom line
CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);
CGContextMoveToPoint(context, 0, self.frame.size.height);
CGContextAddLineToPoint(context, self.frame.size.width, self.frame.size.height);
CGContextStrokePath(context);
}
}
@end
Fazendo dessa forma fará com que seus botões para mostrar corretamente e é menos "hacky".
Outras dicas
Eu acho que você deve definir vista o título do item de navegação para o seu imageView.
self.navigationItem.titleView = imageView;
Eu acho que os UINavigationBar
exibe os UINavigationItem
s em um subexibição, e você estava adicionando seu UIImageView
em cima do que subexibição.
Em um dos meus pontos de vista que eu estou exibindo um rótulo e uma imagem ao lado dele. Acho que acabou de adicionar o rótulo e imagem vista para uma vista que eu então utilizado para a titleView.