2016-03-24 9 views
2

私は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が知る必要があるのは、パラメータを使用してセットアップを呼び出すことだけです。

+0

paramsは関係ありません。重要なことは、それに基づいて、私は制約を修正したいということです。 if params.count == 4 {constraintA.active = false} ' – Kubba

+0

@beyowulf私はそれを取得しません - 私はVCのフレームを見ていますか? – Kubba

+0

@beyowulf私は実際にどのような設定をするのかをもっと簡単に編集しました – Kubba

答えて

0

OK、私はそれを考え出した - しかし、私は100%

class VC: UIViewController { 
    @IBOutlet weak var aView: AView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     aView.setup(false) //now it does work 
    } 
} 

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) { 
     self.yesIfLeft = shouldBeOnLeft 
    } 

    private var yesIfLeft = false { 
     didSet{ 
      self.updateLayout() 
     } 
    } 

    private func updateLayout() { 
     leftConstraint.active = self.yesIfLeft 
     rightConstraint.active = !self.yesIfLeft 
     self.layoutIfNeeded() 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.updateLayout() 
    } 
} 

全体のポイントで実際に好きではないレイアウト変更を引き起こし、layoutSubviews()でも、それらを更新した設定への参照を維持することです。このようにすれば、VCはAViewの内部構造を知る必要はありませんが、これは私にとっては大きなプラスですが、AViewには余分な作業が必要です。おそらく誰かがより良い考えを持っているかもしれないので、私はこの回答を今受け入れているとマークしていません。

3

あなたは

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews

この時点で、それはビューパラメータを設定している、とあなたはビューを操作することができます前に、ユーザー(そう、無グリッチ)に提示され、viewDidLayoutSubviews()内で呼び出す必要がありますディスカッション ビューコントローラに、そのビューがサブビューを配置したばかりになったことを通知するために呼び出されます。

+0

基本的には、自分の 'init'とそのコントローラの' viewDidLayoutSubviews'の後に独自の内部制約を管理する方法はありませんか?むしろそれは可能ですが、この変化は見られません。私はそれを正しく理解していますか? – Kubba

+0

viewDidLayoutSubviewsの後で、あなたの質問と混乱しています。制約がビューに「配置」され、要素の位置を調整できます。要素が配置されていない場合は、それを取得しますか? – UlyssesR

+0

私の編集した質問をチェックしてください。私はそれを編集して、私がやったこと、うまくいったこと、そうでないことを正確に示しました。 – Kubba

関連する問題