私はView Controllerを持っています(重要な場合はStoryboardsを使用しています)。コントローラはその内部にカスタムビューを持っています。それはAView
と呼ばせてください。ビューは、カスタムクラスが設定されたUIViewオブジェクトとしてストーリーボードに配置されます。 AViewのコンテンツは別のXIB上にあります。なぜなら、これは再利用性が高いからです。viewDidAppearが呼び出されるまで、カスタムビューのiOS自動レイアウトの変更は機能しません。
class VC: UIViewController {
@IBOutlet weak var aView: AView!
override func viewDidLoad() {
super.viewDidLoad()
aView.setup(false) //doesn't work
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
aView.setup(false) //doesn't work
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
aView.setup(false) //do work but glitches
}
}
class AView: UIView {
required init?(coder aDecoder: NSCoder) {
//init stuff: loading nib, adding view from it
}
@IBOutlet weak var someView: UIView! //this view has all constraints which are required and additional rightConstraint which is inactive, for future use
@IBOutlet var leftConstraint: NSLayoutConstraint!
@IBOutlet var rightConstraint: NSLayoutConstraint!
func setup(shouldBeOnLeft: Bool) {
leftConstraint.active = true
rightConstraint.active = false
self.layoutIfNeeded()
}
}
いくつかのパラメータに基づいて、このビューを表示する前に設定する必要があります。内部の内容だけを内部から修正しています。私がaView.setup(shouldBeOnLeft:)
をviewDidLoad
またはviewWillAppear
と呼んだ場合、更新や変更はしませんが、変更は表示されません。私がviewDidAppear
に移動した場合は動作しますが、明らかに間違ったビューが表示されます(設定前の状態)。
質問は、VCのviewDidLoad
の内側または直後でない限り、setup
メソッドが呼び出された方法とビューの操作フォームビューコントローラなしで、意図したとおりに動作する方法です。 VCが知る必要があるのは、パラメータを使用してセットアップを呼び出すことだけです。
paramsは関係ありません。重要なことは、それに基づいて、私は制約を修正したいということです。 if params.count == 4 {constraintA.active = false} ' – Kubba
@beyowulf私はそれを取得しません - 私はVCのフレームを見ていますか? – Kubba
@beyowulf私は実際にどのような設定をするのかをもっと簡単に編集しました – Kubba