7

Dies ist , was ich zu erreichen versuchen: NavigationBar NB: Auch mit einem Titel an die Steuerung.Wie UINavigationBar Unterklasse korrekt auch Aussehen mit

Einige zusätzliche Informationen: -

  1. Diese Navigationsleiste wird auf rund 10 View-Controller erscheinen.
  2. Es ist nicht Teil eines Navigation Controllers, wie nicht erforderlich.
  3. Die Schaltfläche auf der linken Seite ist statisch (wird immer in der Navigationsleiste angezeigt).
  4. Der rechte Knopf ist nicht statisch und wird entweder nicht existieren oder unterschiedlich auf den verschiedenen View Controllern sein.
  5. Die linke Taste dient als Schiebe-Menü (das heißt Menü gleitet unterhalb von links)
  6. ich Storyboard im Setup bin mit

Frage Was ist der richtige Weg, dies zu erreichen?

Vorhandener Code Ich habe versucht, dies zu implementieren, aber ich kann nur die eine oder die andere der Tasten erhalten, ohne dass ein Titel funktioniert. Um den Hintergrund zu implementieren ich das Aussehen API verwendet, wie unten:

didFinishLaunching ...

// Custom Navigation Bar appearance setup 
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
                 [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor, 
                 [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor, 
                 [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], 
                 UITextAttributeTextShadowOffset,nil]]; 
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller 
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight]; 
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit]; 

// Set the background image 
UIImage *imageBg = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)]; 
[[UINavigationBar appearance] setBackgroundImage:imageBg forBarMetrics:UIBarMetricsDefault]; 

// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller 
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone]; 

ich subclassed dann UINavigationBar für die linke Taste Schöpfung mit den folgenden: -Subklassen von UINavigationBar: awakeFromNib

UINavigationItem* ni = [[UINavigationItem alloc] init]; 
UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 38.0f, 29.0f)]; 
[leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal]; 
[leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[leftButton setContentMode:UIViewContentModeScaleAspectFit]; 
[leftButton setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin]; 
UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithCustomView:leftButton]; 
ni.leftBarButtonItem = b; 
self.items = @[ni]; 

Dann innerhalb der Storyboard ich eine Navigationsleiste zu dem VC in Frage und Link hinzufügen in die richtige Unterklasse. Ich füge der Navigationsleiste im Storyboard für diesen Controller außerdem einen zusätzlichen Button hinzu und verknüpfe ihn mit einer Steckdose. Dann innerhalb des VC ich versuche, den Titel und die rechte Taste mit der unten zu aktualisieren:

-View-Controller, der die Unterklasse Navigationsleiste hält: viewDidLoad

// Set VC Title for NavBar 
self.title = NSLocalizedString(@"NavBarHomeTitle", @"Navigation Bar - Home page title"); 

// Setup the right navigation bar item 
UIImage *addImage = [UIImage imageNamed:@"addGameButton"]; 
UIButton *addButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[addButton setFrame:CGRectMake(0, 0, addImage.size.width, addImage.size.height)]; 
[addButton setBackgroundImage:addImage forState:UIControlStateNormal]; 
[addButton addTarget:self action:@selector(addGameButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[self.rightBarButtonItem setCustomView:addButton]; 

Das Ergebnis ist eine Navigationsleiste mit nur links Taste. Jetzt glaube ich, dass dies aufgrund des withoutFromNib-Codes oberhalb von alloc init ein neues UINavigationItem ist, daher kann ich den Titel nicht kontrollieren und einen Button hinzufügen. Wie kann ich das abschließen? Ist dies der beste Ansatz oder gibt es andere? Ich kann keine detaillierten Anleitungen darüber finden, wie ich das angehen kann.

Antwort

10

Die bessere Option ist die Verwendung eines Navigationscontrollers, der als Controller fungiert, der den aktuell angezeigten View-Controller abfragt und die Navigationsleiste aktualisiert.

Anstatt die Navigationsleiste zu untergliedern, sollten Sie den Navigationscontroller ableiten. Wenn der angezeigte Ansichts-Controller sich ändert, können Sie das Element für die linke Schaltfläche festlegen, indem Sie es zum Navigationselement dieses Ansichts-Controllers hinzufügen. Jeder View-Controller kann angeben, welche Rechte-Bar-Button-Elemente er benötigt.

Die einfachste Möglichkeit besteht darin, dass der Navigationscontroller als eigener Delegat fungiert und navigationController:willShowViewController: implementiert. Mit dieser Methode kann auf die navigationItem des übergebenen View-Controllers zugegriffen und die leftBarButtonItem gesetzt werden. Sie haben auch Zugriff auf die anderen Methoden der Navigation und View-Controller, falls erforderlich.

Jeder View-Controller würde auch in viewDidLoad seine auf entsprechende Schaltflächen für die Anforderungen seiner Ansicht setzen. Wie Ihre Schaltfläche "addGameButton" -Leiste.

Auf diese Weise funktioniert das Aussehen wie Sie es haben, der Titel des View-Controllers wird automatisch funktionieren und Sie haben die volle Kontrolle und eine Anzahl von Methoden in Ihrer Navigationssteuerungs-Unterklasse, um Ihre Schaltfläche und Interaktionsanpassungen durchzuführen .

+0

danke, könnten Sie bitte ein wenig mehr Informationen darüber, wie dies zu erreichen, bitte? Ich verstehe die Unterklassen des Navigationscontrollers, aber ich bin mir nicht sicher, wie ich die Elemente zusammen mit '... einstellen kann, welche Rechte-Bar-Button-Elemente' ... für jede VC angeben? – StuartM

+0

andere Informationen, die Sie bitte hier angeben könnten? – StuartM

+0

Ich denke, das Problem bei dieser Route ist, dass ich ungefähr 10 View-Controller habe, die in ihren eigenen Navigation Controllern sein müssten? Oder meinst du, den einen Navigationscontroller zu haben und jedes Mal einen neuen Root View Controller zu pushen? – StuartM

Verwandte Themen