web-dev-qa-db-de.com

iOS11 Anpassen der Höhe der Navigationsleiste

Zunächst einmal vielen Dank, dass Sie hergekommen sind und helfen, mein Problem zu lösen. Vielen Dank!!!

In iOS11 Beta6 scheint sizeThatFits: nicht für UINavigationBar zu funktionieren. Ich habe festgestellt, dass sich die Struktur von UINavigationBar durch Reveal my app geändert hat.

Ich habe mich bemüht, die Höhe der benutzerdefinierten Navigationsleiste zu ändern. Es scheint jedoch immer 44 zu sein, und es funktioniert vor iOS11. 

- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width, 64);
    return newSize;
}

enter image description here

Seltsamerweise protokolliere ich gerade seinen Rahmen in der didMoveToSuperview-Methode, seine Höhe ist 64, aber ich sehe wirklich, dass 44 in Reveal und App ist.

Ich habe keine Ahnung davon ... Helfen Sie mir bitte .. Danke.

Aktualisieren:

Ich fand das über meine benutzerdefinierte Navigationsleiste, die sich LayoutConstraints in der Konsole anmeldet: 

"<NSAutoresizingMaskLayoutConstraint:0x604000495ae0 FDCustomNavigationBar:0x7fe2f01399d0.(null) == 42>",
"<NSAutoresizingMaskLayoutConstraint:0x604000495b30 FDCustomNavigationBar:0x7fe2f01399d0.height == 44>"`

fehler Ich verwende auch kein automatisches Layout in meiner Navigationsleiste. Was stimmt damit nicht?

Update 8/28:

enter image description here

Ich habe den Rahmen der benutzerdefinierten Navigationsleiste in der - layoutSubviews-Methode der Navigationsleiste festgelegt. 

- (void)layoutSubviews {
    [super layoutSubviews];

    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 64);

    for (UIView *view in self.subviews) {

        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        } else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.Origin.y = 20;
            frame.size.height = self.bounds.size.height - frame.Origin.y;
            view.frame = frame;
        }
    }
}

in der Navigationsleiste wird jedoch die Ansicht des Controller angezeigt. Wie kann ich das beheben?

13
Jerry4me

Seit iOS 11 unterstützt UINavigationBar Auto Layout vollständig (dies ist der Grund, warum Sie die Einschränkungen sehen). Ich habe ein Radar für Apple geöffnet, weil ich der Meinung war, dass das Einstellen einer Höhenbeschränkung für titleView die Höhe der Navigationsleiste entsprechend angepasst hätte. Dies ist jedoch, was Apple antwortete:

Die vollständige Unterstützung des automatischen Layouts bedeutet nicht, dass Ihre Ansicht andere Aspekte des Layouts der Navigationsleiste beeinflussen kann. Insbesondere erzwingt die Navigationsleiste ihre eigene Höhe und erlaubt nicht, dass die Titelansicht oder andere benutzerdefinierte Ansichten die Höhe der übersteigen Navigationsleiste. Wir arbeiten weiter an diesem Thema und werden Sie wieder kontaktieren.

Bis heute ist das Radar noch offen.

9
emix

Hallo, ich habe gerade das gleiche Problem erlebt.

Das oberste Layout-Handbuch ist jetzt unter iOS 11 veraltet. Sie müssen in Ihren Einschränkungen auf den safeAreaLayoutGuide verweisen.

Hier ist ein Beispiel in Swift

    if #available(iOS 11, *) {
        let guide = self.view.safeAreaLayoutGuide.topAnchor
        let height = (self.navigationController?.navigationBar.frame.height)! - CGFloat(12)
        NSLayoutConstraint.activate([
        self.yourTableView.topAnchor.constraint(equalTo: guide, constant: height)
        ])
    }

Wie Sie sehen, sollte der oberste Anker Ihrer Ansicht mit dem obersten Anker safeAreaLayoutGuide übereinstimmen. In diesem Beispiel verwende ich die variable Höhe, um die neue Einschränkung zu erstellen. Die variable Höhe enthält die Höhe der Navigationsleiste minus einer Konstante.

Sie sollten versuchen, den Höhenwert zu ändern.

Hoffe das hilft dir.