2017-12-17 7 views
-1

これは、すべて高さ/幅を柔軟に設定するか、translatesAutoresizingMaskIntoConstraintsをfalseに設定するという点で数多くの類似の質問があります。スーパービューの読み込みが終了するとサブビューのサイズを変更します

私が作成した拡張機能を使用してビューを追加しています

extension UIView { 
    func addView(storyboard: String, viewIdentier: String) { 
     let story = UIStoryboard(name: storyboard, bundle: nil) 
     let subview = story.instantiateViewController(withIdentifier: viewIdentifier) 
     subview.view.frame = self.bounds 
     self.addSubview(subview.view) 
    } 
} 

ViewDidAppearのすべてが正常に動作して、私は、ビューを初期化するためにこれを使用した場合。しかし、ビュー内のビューがロードされた場合、ビューを含むcontrainViewにはまだロードされていない独自の制約があるため、制約は完全に上書きされます。

私は現在、次のように使用します。

@IBOutlet weak var container: UIView! 

override func viewDidLoad() { 
    container.addView(storyboard: "Modules", viewIdentifier: "subview") 
} 

私は理由の理由のViewDidAppearでビューを初期化する必要はありません。これを修正する方法はありますか?または、スーパービューがロードされた後にサブビュー制約をリロードしますか?

また、私は実際に他のソリューションを使用してみました。私はこの仕事をすることができないので、本当に助けに感謝します。

答えて

1

コードで提案されているハードコーディングされた方法では何もできません。サブビューのフレームをself.boundsに基づいて設定しています。しかし、viewDidLoadでは、self.boundsの最終値はまだわかりません。早すぎる。

レイアウト値を知ることに依存する何かを行う適切な場所は、レイアウトが行われた後、つまりviewDidLayoutSubviewsです。これはアプリの生涯にわたって何度も呼び出すことができることに注意してください。そのたびにサブビューを追加したくないので、Boolフラグを使用してサブビューを1回だけ追加するようにしてください。サブビューを適切に調整するために、スーパービューのその後のサイズ変更で、viewDidLayoutSubviewsに何か別の処理を行う必要があります。

しかし、この種のものを行うには正しい方法は、そのフレームが今後そのスーパービューに対して正確残るよう(おそらくviewDidLoadで)サブビューを追加し、それを制約を与えることですかかわらずときのとスーパービューのサイズを変更する方法。あなたは、あなたの質問で、そのようなアプローチを拒否するように思えますが、それにもかかわらず、適切なことであり、あなたはそれに抵抗する必要があります。

+0

ハハ!さて、マット。アドバイスをいただきありがとうございます。私は答えになると感じていた。 – LateNate

+0

あなたはその気持ちを持っていたと感じました...! :)しかし、私はあなたの方法が破滅していたこと、そしてリサイズに何らかの種類の生の応答を設定するのが正しい方法をなぜ理解しているのか、少なくとも今は願っています。 – matt

関連する問題