0

UINavigationController のルートとして UIViewController があり、次のように大きなタイトルの設定を設定しましたnavigationController?.navigationBar.prefersLargeTitles = true

私の目標は、ビューの左側をナビゲーション タイトルの左側に揃えることですが、値をハード コーディングするのではなく、動的に行いたいと考えています。望ましい最終結果は次のとおりです。

UINavigationBar の配置

を使用して、ナビゲーションバーのタイトルの左または x 位置を取得しようとしています

let navigationLeftX = navigationController!.navigationBar.layoutMargins.left

この値も出力して、値を取得しました8.0

それで、私はこれを作成したビューの x 位置として設定する必要があると考えましたviewWillAppear

// Create a demo view
let demoView = UIView()
view.addSubview(demoView)
demoView.backgroundColor = .orange

// Get the current left margin of the nav title
let navigationLeftX = navigationController!.navigationBar.layoutMargins.left

// Add constraints to your view
demoView.translatesAutoresizingMaskIntoConstraints = false
demoView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: navigationLeftX).isActive = true
demoView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
demoView.widthAnchor.constraint(equalToConstant: 100).isActive = true
demoView.heightAnchor.constraint(equalToConstant: 100).isActive = true

結果は近いですが、まだかなり外れています。

UINavigationController UINavigationBar サブビューとの配置

余白xの値を2倍にしたら、ちゃんと揃うようです

// Get the current left margin of the nav title
let navigationLeftX = navigationController!.navigationBar.layoutMargins.left * 2

UINavigationBar 配置 Swift

したがって、8 ポイントの左マージンとは別に、追加の 8 ポイントのパディングがあり、論理的に考えたところ、ナビゲーションの左マージンを 0 に設定すると、8 ポイントのパディングが表示されるはずであると結論付けようとしていました。 :

navigationController!.navigationBar.layoutMargins.left = 0

しかし驚いたことに、実際にはパディングなしで画面の左端にありました。

UINavigationBar タイトル パディング マージン アラインメント

誰かがこの動作を説明し、おそらくビューをナビゲーション バーのタイトルに動的に揃える最良の方法を共有できますか?

前もって感謝します

4

1 に答える 1

0

同様の質問が別のユーザーに尋ねられました

この値を潜在的に与える可能性のある2つの方法に出くわしました。

1. ナビゲーション バーの階層を繰り返す

var leftMargin: CGFloat = 0.0

for view in navigationController!.navigationBar.subviews
{
    if let classToFind = NSClassFromString("_UINavigationBarLargeTitleView"),
       view.isKind(of: classToFind)
    {
        leftMargin = view.layoutMargins.left
    }
}

// Set your left margin of view to align to leftMargin variable

ここで不明な点が 2 つあります。それは、これがプライベート クラスをクエリしているかどうか、およびこれで問題ないかどうかです。2 つ目は、このクラス名は将来の iOS リリースで変更される可能性があることです。

2.systemMinimumLayoutMargins

私が遭遇したもう1つのことは、次のように実行できるsystemminimumlayoutmarginsを取得することでした:

var leftMargin = navigationController!.systemMinimumLayoutMargins.leading

// Set your left margin of view to align to leftMargin variable

これは機能する値を提供しますが、タイトルの左の値を表すためにこれが意図された使用法であったかどうかはわかりません

誰かがより良い解決策を思いついた場合に備えて、これを回答済みとしてマークしませんが、これが役立つ可能性がある人のためにこれを指摘しました.

于 2022-01-22T09:48:47.570 に答える