web-dev-qa-db-ja.com

iOS11ナビゲーションバーの高さのカスタマイズ

まず第一に、ここに来てくれてありがとう、そして私の問題を解決するのを手伝ってください。ありがとうございました!!!

IOS11 beta6では、sizeThatFits:はUINavigationBarでは機能しないようです。アプリの公開によってUINavigationBarの構造が変更されたことに気付きました。

カスタムナビゲーションバーの高さを変更するために最善を尽くしました。ただし、常に44、およびiOS11より前に動作します。

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

enter image description here

奇妙なことに、フレームをdidMoveToSuperviewメソッドで記録するだけで、その高さは64ですが、Revealとappでは44であることが実際にわかります。

これについてはわからない...助けてください。ありがとう。

更新:

私のカスタムナビゲーションバーについて、LayoutConstraintsはコンソールに次のようにログインすることがわかりました:

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

バグ、ナビゲーションバーで自動レイアウトを使用していません。どうしたの?

アップデート8/28:

enter image description here

カスタムナビゲーションバーのサブビューフレームをナビゲーションバーの- layoutSubviews方法。

- (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;
        }
    }
}

ただし、ナビゲーションバーはView Controllerのビューを覆います。どうすれば修正できますか?

13
Jerry4me

IOS 11 UINavigationBarは自動レイアウトを完全にサポートしているため(これが制約を確認している理由です)。 Appleにレーダーを開いたのは、titleViewに高さの制約を設定すると、それに応じてナビゲーションバーの高さが調整されると考えたためです。ただし、これはApple =返信済み:

自動レイアウトの完全なサポートは、ビューがナビゲーションバーのレイアウトの他の側面に影響を与えることを意味しません。特に、ナビゲーションバーは独自の高さを強制し、タイトルビューまたは他のカスタムビューが高さを超えないようにしますナビゲーションバー。この問題については引き続き作業を進めており、再度フォローアップを行います。

今日現在、レーダーはまだ開いています。

9
emix

こんにちは、私はちょうどこの同じ問題を経験しました。

IOS 11では、最上位のレイアウトガイドが廃止されました。制約でsafeAreaLayoutGuideを参照する必要があります。

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)
        ])
    }

ご覧のとおり、ビューのトップアンカーはsafeAreaLayoutGuideトップアンカーと一致する必要があります。この例では、可変の高さを使用して新しい制約を作成しています。変数heightには、ナビゲーションバーの高さから定数を引いた値が含まれます。

高さの値を変更してみてください。

これがお役に立てば幸いです。