私は完全にプログラム化されたSwift 4.1を使用してiOS 11.Xアプリで作業しています。Xcode 9.4 の使用
回転をサポートして、ビューの上部までの距離が 10 ポイントの中央 (水平方向) にビューを配置しようとしています。
アプリのアーキテクチャには、次のような通常のものがあります (ストーリーボードはありません)。
- UIWindow オブジェクトと UINavigationController をルートとする AppDelegate
- navigationController には rootViewController として UIViewController() があります
ランドスケープ モードではstatusBar
が表示されないため、自動レイアウト構成を簡素化するために、次のように にトップ アンカーを追加することにしましたnavigationBar
(コードはわかりやすくするために簡略化されています)。
let navBar = self.navigationController!.navigationBar
let label = UILabel()
label.backgroundColor = .yellow
label.text = "TEXT"
label.textAlignment = NSTextAlignment.center
self.view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.widthAnchor.constraint(equalToConstant: 50).isActive = true
label.heightAnchor.constraint(equalToConstant: 20).isActive = true
label.centerXAnchor.constraint(equalTo: label.superview!.centerXAnchor).isActive = true
label.topAnchor.constraint(equalTo: navBar.bottomAnchor, constant: 10).isActive = true
結果は予想通り。うまく回転し、アプリが横向きまたは縦向き (デバイスとシミュレーターの両方) で起動された場合にも正常に動作します。
今。GitHub での FastForward 1 コミット、全体的な App View アーキテクチャに変更はなく、同じコードでも、次のメッセージが表示されてクラッシュします
*** NSGenericException', reason: '共通の祖先がないため、アンカーを使用して制約をアクティブ化できません。制約またはそのアンカーは、異なるビュー階層の項目を参照していますか? それは違法です。
ここで何が起こっているのか、何か考えはありますか?. 以前の GitHub コミットから .zip をダウンロードして分離し、動作することを再確認しました!!. しかし、現在のコミットは、これに関連するコードを変更せずに失敗しますUILabel
。
navBar はUIWindow
-> UILayoutContainerView
->の一部ですUINavigationBar
- Xcode が NSLayoutYAxisAnchor アンカーについて不平を言うのはなぜですか? (centerX と top アンカーしかありません)
- 以前のコミットで navBar.bottomAnchor への label.topAnchor が機能するのはなぜですか (同じビュー階層にないにもかかわらず)?