webentwicklung-frage-antwort-db.com.de

Wie man die Höhe von UINavigationBar in iOS 11 richtig einstellt

In meiner iOS 9+ App verwende ich UINavigationBar in einigen der UIViewControllers "manuell" (= platziere sie direkt in VC anstelle von UINavigationViewController).

Das Einstellen einer Höhe für eine solche UINavigationBar mit einer einfachen Kontraktion war zuvor kein Problem. In iOS 11 verwendet die Leiste jedoch immer noch korrekt die zugewiesene Größe, der Inhalt wird jedoch nicht mehr korrekt positioniert (wird jetzt nach oben ausgerichtet). 

 enter image description here

Irgendeine Idee, wie man das löst?

BEARBEITEN:

Ich bin mir ziemlich sicher, dass es sich nicht um ein Duplikat von " Customizing iOS 11 Navigation Bar Height Customizing " handelt. Diese Frage befasst sich mit einem Problem mit UINavigationBar-Unterklassen, während ich UINavigationBar direkt verwende. Zusätzlich scheint das beschriebene Problem seit Beta 4 gelöst zu sein, während ich das Problem in Beta 6 habe.

EDIT 2:

Inzwischen habe ich eine UINavigationBar-Unterklasse implementiert, wie von CharlieSu im anderen Thread vorgeschlagen. Dies löste jedoch das Problem in meinem Fall nicht. Es scheint, dass die Subview-Frames alle richtig gesetzt sind (ohne dass dies manuell gemacht wird), aber das Layout ist trotzdem kaputt. Das manuelle Einstellen der Frames macht also keinen Unterschied. 

4
Andrei Herford

Ich stehe gerade vor diesem Problem. Zunächst scheint es eine andere Höhenbeschränkung in der Bar zu sein, die mit meiner in Konflikt steht, aber meine Priorität hat die Priorität 1000, sodass es nicht das Problem zu sein scheint. Dann sehe ich eine andere Ansicht in UINavigationBar "UINavigationBarContentView", diese Ansicht hat eine Höhe größer als 0.

Ich habe dann versucht, navigationBar.clipsToBounds = true zu setzen, und es funktioniert, weil die übergeordnete Ansicht die richtige Höhe hat ... 

BEARBEITEN: Wenn Sie den Schatten der Leiste anzeigen müssen, benötigen Sie clipToBounds = false. In diesem Fall können Sie die Navigationsleiste unterteilen 

import UIKit

class SecondNavigationBar: UINavigationBar {
    override func layoutSubviews() {
        super.layoutSubviews()

        for subview in self.subviews {
            var stringFromClass = NSStringFromClass(subview.classForCoder)
            print("--------- \(stringFromClass)")
            if stringFromClass.contains("BarBackground") {
                subview.frame = self.bounds
            } else if stringFromClass.contains("UINavigationBarContentView") {
                subview.frame = self.bounds
            }
        }
    }
}
2
Eva Madrazo

Ich hatte auch dieses Problem. Ich habe es so gelöst:

 -(void)layoutSubviews{
        [super layoutSubviews];
        CGRect rectStatus = [[UIApplication sharedApplication] statusBarFrame];
        if (rectStatus.size.height==44.f) {

        }else{
            if (@available(iOS 11.0, *)) {
                for ( UIView*aView in self.subviews) {
                    if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UINavigationBarContentView"]) {
                        aView.frame = CGRectMake( 0,20,aView.frame.size.width,44);
                    }
                    else if ([NSStringFromClass(aView.classForCoder) isEqualToString:@"_UIBarBackground"]) {
                        aView.frame = CGRectMake(0,0,aView.frame.size.width, 64);
                    }
                }
            }
        }
    }
2
user8639894

In iOS 11 können wir barPosition in der Unterklasse von UINavigationBar direkt überschreiben (geben Sie UIBarPositionTopAttached statt des Standardwerts UIBarPositionTop zurück), wenn Sie in UIViewController die benutzerdefinierte UINavigationBar verwenden
so was :

- (UIBarPosition)barPosition {
    return UIBarPositionTopAttached;
}

der Layout-Code sieht folgendermaßen aus:

    NSLayoutConstraint* a = [navigationBar.widthAnchor constraintEqualToAnchor:viewController.view.widthAnchor];
    NSLayoutConstraint *b = [navigationBar.centerXAnchor constraintEqualToAnchor:viewController.view.centerXAnchor constant:0];
    NSLayoutConstraint* c = [navigationBar.centerYAnchor constraintEqualToAnchor:viewController.view.topAnchor constant:X];

   [NSLayoutConstraint activateConstraints:@[a,b,c]];   

Stellen Sie nicht die Höhe ein, es sollte immer 44 sein. 

Es funktioniert gut unter iOS 11. Die Ansichtshierarchie entspricht der von UINavigationController.
Aber es funktioniert nicht unter iOS 11. Wir müssen UINavigationBarDelegate setzen, um UIBarPositionTopAttached zurückzugeben 

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar;  
0
PatrickChow