wake-up-neo.net

Hinzufügen einer Navigationsleiste zu einer Ansicht ohne Navigationscontroller

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?

the story board has the navigation item

the app does not

19
user3381665

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 -

enter image description here

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];
19
raurora

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 barvisible 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],
                             ]];
5
Aerows

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]
2
Vitaly

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.

1
ingconti

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 ...

1
ingconti