2017-03-19 13 views
2

私は、分布をFill Equallyに設定したIBでUIStackViewを作成しました。私は各サブビューのフレームを取得するために探しているが、次のコードは常に(0、0、0、0)を返します。UIStackViewサブフレームのフレームを取得

class ViewController: UIViewController { 
    @IBOutlet weak var stackView: UIStackView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let pView = UIView() 
     let sView = UIView() 

     pView.backgroundColor = UIColor.red 
     sView.backgroundColor = UIColor.orange 

     stackView.addArrangedSubview(pView) 
     stackView.addArrangedSubview(sView) 
    } 

    override func viewDidLayoutSubviews() { 
     print(stackView.arrangedSubviews[0].frame) 
     print(stackView.arrangedSubviews[1].frame) 
    } 
} 

私は、同じように塗りつぶすように設定されたスタックビューが自動的に計算を設定すると思うでしょう。

ご協力いただければ幸いです。

+0

はい。レイアウトは問題ありません。 3つのオプションを使って各サブビューを非表示にして表示するオプションが必要です。 pViewだけが表示され、sViewのみが表示され、次に両方のビューが表示されます。サブビューフレーム/境界を取得する必要がある理由は、各ビューの画像の上に描画するために描画ビューをオーバーレイしたいということです。 1つのビューのみが表示されている各ビュー間を切り替えるとうまく動作しますが、両方のサブビューが表示されている場合、フレームサイズが変わり、描画ビューフレームを調整する必要があります。私は上記のコードが私にフレームを与えることを望んでいたが、それはしない。 – Wozzer

+0

私の答えをチェックしましたか?また、スタックビューのサブビューのhiddenプロパティをアニメートすることもできます。 – agibson007

答えて

7

あなたのコードを読んだ後、これはviewDidLayoutSubviews()の誤解に過ぎないと思います。基本的には、メインビューの子孫であるすべてのビューがレイアウトされたときに呼び出されますが、これらのビューのサブビュー(子孫)は含まれません。アップルのディスカッションnotesを参照してください。

"ビューコントローラのビューの境界が変更されると、ビューはサブビューの位置を調整し、システムはこのメソッドを呼び出しますが、このメソッドが呼び出されても、ビューのサブビューの個々のレイアウトは各サブビューは独自のレイアウトを調整する責任があります。

これで、サブビューのフレームを取得する方法はたくさんあります。

まず、viewdidloadに1行のコードを追加してそこから取得できます。

override func viewDidLoad() { 
    super.viewDidLoad() 

    let pView = UIView() 
    let sView = UIView() 

    pView.backgroundColor = UIColor.red 
    sView.backgroundColor = UIColor.orange 

    stackView.addArrangedSubview(pView) 
    stackView.addArrangedSubview(sView) 
    stackView.layoutIfNeeded() 
    print(stackView.arrangedSubviews[0].frame) 
    print(stackView.arrangedSubviews[1].frame) 

} 

または、あなたはviewDidAppearを待ってそこにチェックインすることができます。

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    print(stackView.arrangedSubviews[0].frame) 
    print(stackView.arrangedSubviews[1].frame) 
} 
+0

ありがとうございます。これは多くの助けとなりました。 – Wozzer

関連する問題