2016-04-28 21 views
1

シナリオ -ビューの高さが&の幅のラベルがあります。高さと幅がスーパービューの高さと幅に揃っています(寸法が可変で、ビューごとに変更されることを示しています)。 ラベルのプロパティを変更する必要があります。私は、関数の中でそう -異なる場合でUIの更新が異なる場合

func ammendViews() 
{ 
    noOfStudentsLbl.layer.masksToBounds = true 
    noOfStudentsLbl.layer.cornerRadius = noOfStudentsLbl.frame.height/2 
    maleCountLbl.clipsToBounds = true 
    maleCountLbl.layer.cornerRadius = maleCountLbl.frame.height/2 
    femaleCountLbl.clipsToBounds = true 
    femaleCountLbl.layer.cornerRadius = femaleCountLbl.frame.height/2 

    noOfStudentsLbl.hidden = false 
    maleCountLbl.hidden = false 
    femaleCountLbl.hidden = false 


} 

エフェクト1から enter image description here

効果2

enter image description here

ケース - 1(のviewDidLoad()& viewWillAppear() )

私はviewDidLoad()でこの関数を呼び出しました& viewWillAppear()そしてそれは効果1を持っていました。

ケース - 2(viewDidLayoutSubViews())

私は(viewDidLayoutSubViewsでそれを呼ばれる)との変更は、当初EFFECT1として登場し、いくつかの時間後にEFFECT2に変更。

ケース - 2(dispatch_async)

そして私はと非同期方式でmainQueueに入れて -

override func viewWillAppear(animated: Bool) 
    { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.ammendViews() 
     } 

    } 

そして、これは効果-2を示す働いていました!

私の理解 - 私のラベルの寸法がダイナミックだったつまり、デバイスサイズの上で、メインビューの大きさに依存し、viewWillAppear()とのviewDidLoad()が呼び出されたときに、ビューが適切にそうそこに置かれていなかったので、私のレーベルの半分の効果でした。

viewDidLayoutSubViews()を呼び出すと、ビューは既に変更されているためレイアウトされていますが、数秒間中断された後にはどうなったのですか?

そして、私は

ここ
dispatch_async(dispatch_get_main_queue()) { 
        } 

に、私は非同期的が、メインスレッドでやっていた、だから私は直接mainQueueでそれをしたとき、なぜそれが起こらなかったことを置いたときに、なぜそれがすべてが完璧に動作しなかった(非同期ではありません)。

答えて

0

ご理解の方が正しいです。ビューはまだviewDidLoadviewWillAppearに配置されていません。 viewDidLayoutSubviewsにコードを挿入すると、自動レイアウトが実行され、ビューが正しくレイアウトされ、フレームが正しく設定されます。これはこれを行う正しい場所です。

dispatch_asyncを使用している場合、後でメインスレッドで実行するようにそのコードをスケジュールしています。 iOSがこのコードの実行に慣れると、サブビューがレイアウトされているだけです。printを非同期コードに入れてviewDidLayoutSubviewsに入れると、非同期コードが実行される前にviewDidLayoutSubviewsが完了することがわかります。

+0

しかし、viewDidLayoutSubviewsにもいくつかの欠陥があります。私は私の質問で説明した。何故ですか ? –

+0

何か奇妙なことが起こっています。どのようにあなたのUIをレイアウトしていますか?ストーリーボードまたはコードで。 UIの作業がメインスレッドで行われていることを確認してください。コードでUIをレイアウトする場合は、 'layoutIfNeeded'コールが必要な場合があります。 – vacawama