2016-05-26 7 views
1

viewDidLayoutSubviews()内のオブジェクトのサイズと位置を変更しようとしています。メソッドfixPositions()が呼び出されますが、すべての変更は次の画面に移動した後にのみ適用されます。オブジェクトのサイズと位置をプログラムで変更する

override func viewDidLayoutSubviews() { 
    let width = filterMainView.frame.width/5 

    filterView.frame = CGRectMake(0.0, 0.0, width, 50.0) 

    fixPositions(filterSubview, image: filterImage, button: filterButton, width: width) 
} 

func fixPositions(mainView: UIView, image: UIImageView, button: UIButton, width: CGFloat) { 
    let buttonFrame = CGRectMake(0.0, 0.0, width, 50.0) 

    button.frame = buttonFrame 
    mainView.frame = buttonFrame 
    image.frame = CGRectMake((width - 30.0)/2, 10.0, 30.0, 30.0) 
} 

また、filterViewが正常に動作し、それはすぐに変更されます:

は、ここに私のコードです。この方法では何が問題になりますか?レイアウトが行われた後、このロジックはviewWillLayoutSubviews

viewdidLayoutSubviewsにする必要があります

+0

あなたのコードを 'viewWillLayoutSubviews()'に入れてみてください。 – AnthonyR

+0

@AnthonyRoaniしかし、もし私がそれらのアクションを5回達成すべきならどうしますか?それは多くの余分なコード行を追加します。 – Slava

+0

なぜこれらのデリゲートメソッドを使用しているのかわかりません。あなたの要素フレームが変更された後に 'self.layoutIfNeeded()'を呼び出さないのはなぜですか?これによりフレームが更新されます。私はあなたのケースに 'layoutSubviews()'メソッドを使うべきではないと思う(UIButtonフレームはいつも変わっているようだ) – AnthonyR

答えて

0

self.layoutIfNeeded()を呼び出すと、要素フレームが変更された後、フレームが更新されます。フレームが常に変化しているときに使用する方が良いでしょう。

0

が呼び出されます。あなたが潜在的に無限のレイアウトと再レイアウトループに入る可能性があるので、レイアウトロジックを置くことは悪いことかもしれません。

+0

しかし、私はこの関数を5回呼び出す必要があります。それは私のコードを長くします。さらに、 'viewdidLayoutSubviews'から呼び出すいくつかのメソッドは正常に動作しています。それはなぜ機能しないのですか? – Slava

+0

コードの多くを見ることなく私が言うことができました。レイアウトロジックは 'viewWillLayoutSubviews'で発生するはずですので、' viewDidLayoutSubviews'を処理することで奇妙なことが起こっている可能性があります –

関連する問題