Wie bekomme ich einen UINavigationController, um seine Ansichtsgröße beim Einstellen der transluzenten Eigenschaft NICHT zu ändern?

8

Ich habe eine App, in der ich bisher einen UINavigationController mit einer UINavigationBar verwendet habe, dessen Eigenschaft translucent = YES ist. Dies bedeutet, dass die Inhaltsansicht des UINavigationControllers (d. H. Die Ansichten der von Ihnen gedrückten Ansichtscontroller) Vollbildmodus (minus Statusleiste) ist.

Wenn Sie jedoch navigationBar.translucent = NO setzen, wird diese Containeransicht kürzer, da Apple vermutlich angenommen hat, dass Sie keinen Inhalt unter einer undurchsichtigen navigationBar benötigen.

... außer, wenn Sie das tun, was wir tun und eine Navigationsleiste verwenden, die weg scrollt (siehe Dieser Beitrag, wie man das macht ) Ich würde gerne wissen, ob das möglich ist.

Ich möchte transluzent = NEIN haben, aber alles so verhalten, als ob es immer noch auf JA gesetzt wäre. Ich mag die Funktionalität von transluzent = YES, aber ich möchte nicht, dass der Balken von UIKit durchscheinend gemacht wird.

    
horseshoe7 05.11.2012, 15:43
quelle

4 Antworten

0

Ich habe eine Lösung gefunden, die funktioniert, obwohl es in der Tat ein bisschen wie ein Hack ist.

Die Idee ist, der transluzenten Navigationsleiste einen undurchsichtigen Hintergrund zu geben. Leider bin ich mit der Lösung nicht zufrieden, da sie schmutzig und nicht gekapselt ist und einige potentielle Probleme mit sich bringt, aber ich bin glücklich, weil sie den Job erledigt hat.

In der Basisansicht-Controller-Klasse meiner Anwendung (d. h. MyViewController: UIViewController) instanziere ich eine neue ivar UIView * _navigationBarBG in der viewDidLoad-Methode und gebe ihr denselben Frame wie self.navigationController.navigationBar. Ich habe dann seine backgroundColor-Eigenschaft auf [UIColor whiteColor] gesetzt, obwohl Sie so mehr Tönung erzielen, denke ich. [EDIT: Wenn Sie ein Purist sein wollten (Farbwerte bleiben genau so, wie sie aus der .psd stammen), könnten Sie das _navigationBarBG zu einem UIImageView machen und dort Ihren eigenen Hintergrund und den Hintergrund der eigentlichen UINavigationBar verwenden, die Sie zum Löschen festgelegt haben (oder strecken Sie ein transparentes 1px-Bild, wenn Sie ein typisches "Ändern Sie Ihre Navigationsleiste mit einem Bild" -Rezept verwenden möchten, das sich irgendwo im Internet befindet)]

%Vor%

DANN (und das ist der beschissene Teil, aber ich sehe keinen anderen Weg), ich füge diese Ansicht als Unteransicht hinzu. ABER, wenn Sie normalerweise [self.view addSubview: anyView] aufrufen würden, müssen Sie sicherstellen, dass Sie [self.view insertSubview: anyView unterSubview: _navigationBarBG] aufrufen;

%Vor%

Wenn Sie das vergessen, werden diese hinzugefügten Ansichten unter Ihrem Navbar-Hintergrund gleiten und komisch aussehen. Sie müssen also wissen, dass dies eine Fehlerquelle ist.

Warum mache ich das? Wieder könnten Sie fragen ... Ich möchte in der Lage sein, eine scrollende Navigationsleiste zu haben, die beim Scrollen in der Tischansicht aus dem Weg rollt, wodurch dem Benutzer mehr Platz auf dem Bildschirm gegeben wird. Dies geschieht mithilfe des scrollView-Delegaten (scrollViewDidScroll :) und viewWillAppear:

%Vor%     
horseshoe7 07.11.2012, 15:36
quelle
11

Was für mich funktionierte war hinzuzufügen %Code% im extendedLayoutIncludesOpaqueBars = true

so etwas

%Vor%

Ich hoffe, es wird auch für dich funktionieren

    
chrs 11.05.2015 11:29
quelle
1

Es ist nicht unbedingt eine gute Antwort, aber Sie könnten Ihre Ansicht so hoch ausgleichen, wenn Sie nicht durchscheinend sind.

%Vor%

Sie könnten das in Ihre viewDidLoad oder viewWillAppear einfügen und wenn Sie eine Reihe von View-Controllern haben, können Sie einfach alle ableiten und Ihre Logik in die Unterklasse einfügen.

    
rooster117 05.11.2012 19:58
quelle
0

Ich war auf der Suche nach einer Antwort, da ich meine Subviews auf (0,0) und nicht (0,44) (in Bezug auf die Screen-Grenzen) haben wollte, aber ich konnte keine Antwort finden, wie ich es machen sollte setze dies in der NavigationController, die ich dachte, wäre eine enthaltene Eigenschaft.

Was ich am Ende getan habe, war sehr einfach: Fügen Sie dem Navigationscontroller eine Unteransicht hinzu, die die Breite und Höhe der Navigationsleiste war, aber fügen Sie dann die Unteransicht unterhalb der Navigationsleiste ein.

Jetzt ist die Einstellung Translucent = YES, aber sie erscheint immer noch solide und die Subviews verhalten sich wie ich will.

BEARBEITEN: Nachdem Sie den ursprünglichen Post erneut gelesen haben, müssen Sie, wenn Sie die Navigationsleiste wegrollen, die neue Unteransicht ausblenden und anzeigen, wie Sie es auch mit dem Nav tun Leiste

    
Dexterity 21.01.2013 16:15
quelle