UINavigationBar subview versteckt sich das Recht vor UIBarButtonItem
-
06-07-2019 - |
Frage
In dem Root-Tabelle View-Controller füge ich eine Subview, die ein Bild enthält:
[self.navigationController.navigationBar addSubview:imageView];
Dann in einer untergeordneten Tabelle View-Controller, die ich auf den Stapel schiebe ich ein Recht UIBarButtonItem gesetzt:
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightAction:)];
self.navigationItem.rightBarButtonItem = rightButton;
[rightButton release];
Ich kann nicht verstehen, warum die Schaltfläche nicht in der Navigationsleiste angezeigt wird. Wenn ich (das Leerzeichen) tippen Sie auf die rightAction. Methode wird aufgerufen, so dass die Taste dort „ist“, erwarten, dass es nicht angezeigt wird
Ich habe versucht, den Imageview subview senden in der Navigationsleiste zu sichern, aber ohne Erfolg. Es Art macht Sinn, da die Schaltfläche gehört eigentlich zum UINavigationItem sowieso ...
Weiß jemand, wie ich es richtig, dass die Tastenanzeige machen?
Update: die Zurück-Taste korrekt anzeigt, aber es wird durch das System aber ...
hinzugefügtLösung
Eine bessere Möglichkeit, ein Bild zu einem UINavigationBar
hinzuzufügen, ist es, Unterklasse oder eine Kategorie zu machen und die drawRect
Methode überschreiben:
// #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
Doing es auf diese Art und Weise wird dazu führen, dass Tasten richtig zeigen und weniger „Hacky“.
Andere Tipps
Ich glaube, Sie den Navigationspunkt Titel im Hinblick auf Ihre Imageview setzen soll.
self.navigationItem.titleView = imageView;
Ich denke, die UINavigationBar
zeigt die UINavigationItem
s in einem Subview, und Sie fügen Ihre UIImageView
oben auf dieser subview.
In einem meiner Ansichten ich ein Etikett Anzeige und ein Bild daneben. Ich glaube, ich nur das Etikett und die Bildansicht zu einer Ansicht hinzugefügt, die ich dann für die Titleview verwendet.