Ich habe ein Seitenmenü, das herausschiebt, um eine Tabellenansicht anzuzeigen, und von dort aus habe ich Segmente, die den Reveal View Controller verwenden. Das Segment muss sich direkt mit dem View Controller verbinden. Ich kann keinen Navigationscontroller verwenden.
Wie füge ich eine Navigationsleiste mit einem Bar-Schaltflächenelement ohne Navigationscontroller hinzu?
Es gibt verschiedene Möglichkeiten, um Ihre Frage zu beantworten. Ich habe es gerade programmgesteuert gelöst und den folgenden Code in meine viewWillAppear
geschrieben (Anmerkung - viewDidLoad
ist auch okay, wird aber nicht vorgeschlagen) -
- (void) viewWillAppear: (BOOL) animiert { UINavigationBar * myNav = [[UINavigationBar-Zuordnung] initWithFrame: CGRectMake (0, 0, 320, 50)]; [UINavigationBar-Erscheinungsbild] .barTintColor = [UIColor lightGrayColor]; [self.view addSubview: myNav]; UIBarButtonItem * cancelItem = [[UIBarButtonItem-Zuordnung] initWithTitle: @ "Cancel" style: UIBarButtonItemStyleBordered Ziel: Selbst Aktion: Null]; UIBarButtonItem * doneItem = [[UIBarButtonItem-Zuordnung] initWithTitle: @ "Done" style: UIBarButtonItemStyleBordered Ziel: Eigenaktion: Null]; UINavigationItem * navigItem = [[Zuordnung UINavigationItem] initWithTitle: @ "Navigationstitel"]; navigItem.rightBarButtonItem = doneItem; navigItem.leftBarButtonItem = cancelItem; myNav.items = [NSArray arrayWithObjects: navigItem, nil]; [UIBarButtonItem-Erscheinungsbild] .tintColor = [UIColor blueColor]; }
Sie haben also eine weiße Navigationsleiste mit blauen Schaltflächen ohne Navigations-Controller. Es gibt auch andere Möglichkeiten, es in Ihrem Fall zu implementieren. Hoffe, das war hilfreich.
Ausgabe -
Update -
Bilder hinzufügen -
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,10,32,32)];
[myImage setImage:[UIImage imageNamed:@"image.png"]];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myImage];
[self.view addSubview:myImage];
Es gibt eine Möglichkeit, den NavigationItem
im Interface Builder dafür zu verwenden.
Fügen Sie zunächst ein NavigationItem
zu Ihrem ViewController
im Interface-Builder hinzu, wie Sie es mit einem NavigationController
tun würden. Stellen Sie sicher, dass NavigationBar
sichtbar ist, indem Sie unter simulierte Metriken etwas anderes als Inferred
und None
auswählen.
Fügen Sie in viewDidLoad
die folgenden Zeilen ein:
- (void)viewDidLoad
{
[super viewDidLoad];
UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame: frame];
bar.items = @[self.navigationItem];
[self.view addSubview: bar];
}
Was frame
betrifft, ist width
das gleiche wie Ihr ViewController
und height
entweder 44.0
oder 64.0
, je nachdem, ob status bar
visible ist oder nicht.
CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, navigationBarHeight);
Und wenn Sie unterschiedliche Ausrichtungen unterstützen wollen verwenden Sie NSLayoutConstraints
:
CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
[self.view addConstraints: @[
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeLeft
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeLeft
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeRight
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeRight
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: self.view
attribute: NSLayoutAttributeTop
relatedBy: NSLayoutRelationEqual
toItem: bar
attribute: NSLayoutAttributeTop
multiplier: 1.0
constant: 0.0],
[NSLayoutConstraint constraintWithItem: bar
attribute: NSLayoutAttributeHeight
relatedBy: NSLayoutRelationEqual
toItem: nil
attribute: NSLayoutAttributeNotAnAttribute
multiplier: 1.0
constant: navigationBarHeight],
]];
Swift 4 Version
let navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
navigationBar.barTintColor = UIColor.lightGray
view.addSubview(navigationBar)
let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: nil)
let navigationItem = UINavigationItem(title: "Title")
navigationItem.rightBarButtonItem = cancelButton
navigationItem.leftBarButtonItem = doneButton
navigationBar.items = [navigationItem]
seien Sie beim Hinzufügen in "viewWillAppear" sehr vorsichtig, da diese Methode mehrmals aufgerufen werden kann (beispielsweise wird ein Modal angezeigt ...). Verwenden Sie also einen Lazy-Ansatz:
1) deklarieren Sie eine var:
var myNav: UINavigationBar?
2) test wenn bereits eingestellt:
viewWillAppear:(BOOL)animated {
if self.myNav != nil{
return
}
self.myNav = ....
3) Stellen Sie sicher, dass Sie den vorhandenen Controller entfernen, zum Beispiel auf didDisappear ...
note .. ist nicht korrekt, um die Größe anzugeben. Wenn iOS rotiert, funktioniert es nicht.
seien Sie beim Hinzufügen in "viewWillAppear" sehr vorsichtig, da diese Methode mehrmals aufgerufen werden kann (beispielsweise wird ein Modal angezeigt ...). Verwenden Sie also einen Lazy-Ansatz:
1) deklarieren Sie eine var:
var myNav: UINavigationBar?
2) test wenn bereits eingestellt:
viewWillAppear:(BOOL)animated {
if self.myNav != nil{
return
}
self.myNav = ....
3) Stellen Sie sicher, dass Sie den vorhandenen Controller entfernen, zum Beispiel auf didDisappear ...