2016-05-17 17 views
0

私はUINavigationControllerをカスタムビューコントローラでインスタンス化しました。私は、ビューのサイズが変更されていないことがわかり、MyOtherViewController's viewWillAppear()関数ではviewWillAppear()によってUIViewControllerのビューがサイズ変更されない

@IBAction func showVC(sender: AnyObject) { 
    let vc = MyOtherViewController() 
    navigationController?.pushViewController(vc, animated: true) 
} 

:そのビューは、タップすると、ナビゲーションコントローラを持つことになり、ボタンが視界に異なるカスタムビューコントローラのビューをプッシュ含まれていますビュー階層に収まるようにします。

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    print("view: \(view)") 
} 

print()関数からの出力は、次のとおり

ビュー:<のUIView:0x7f9432719bd0。フレーム=(0 0; 600 600);自動サイズ調整= W + H;層= <のCALayer:0x7f9432717cc0 > >

あなたが見ることができるように、ビューのサイズは.xibファイルから元のサイズである、この時点ではまだ600 x 600です。ビューはさまざまなiPhoneとiPadのディスプレイに表示されるため、.xibのビューのサイズは調整していません。

私のジレンマは、ビューの幅に基づいてNSLayoutConstraintsを構築する必要があるため、ビューの最終的な寸法が必要であるということです。

ビューのサイズを変更するには、どのような方法が推奨されますか? viewWillAppear()が呼び出された時点でビューのサイズが変更されることを期待するのは間違っていますか?

+0

あなたは、ビューの実際のサイズを取得するために 'viewWillLayoutSubviews'を上書きすることができます。 – Paulw11

答えて

1

-viewWillAppear()が呼び出されるまでにビューのサイズが変更されるとは思っていませんか?

はい。時間がviewDidAppearまでにリサイズされることは確実です。しかし、それはあなたの目的には遅すぎるかもしれません。イベントは、おそらくviewWillLayoutSubviewsまたはviewDidLayoutSubviewsです。この時点で一度だけ変更を実行したいので、もしこれがブールフラグを使用し、将来的に何度も呼び出されます。

var didSetUp = false 
override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    if self.didSetUp { return } 
    self.didSetUp = true 
    // ... do stuff ... 
} 
+0

しかし、私はこれの音が気に入らない: "私はビューの幅に基づいていくつかのNSLayoutConstraintsを構築する必要があります"。レイアウトの制約を構築するためにビューの幅を知る必要があると思うなら、それは間違っています!レイアウト制約の全ポイントは、すべてが_relationships_によって決定されるため、実際の数値を知る必要はありません。 – matt

+0

**水平ページング**を自動レイアウトの 'UIScrollView'に適切に構築するには、ビューの幅を知るために** _ **が必要です。 –

関連する問題