2015-12-07 16 views
6

私はアプリケーションの分割ビューをサポートするマルチタスクを採用しています。しかし、私はtraitCollectionDidChangeは、アプリケーションが右側にあるときに呼び出されないことがわかります。誰もがこれについてアイデアを持っていますか?マルチタスク時にtraitCollectionDidChangeが呼び出されない

答えて

6

viewWillTransitionToSizeメソッドを試しましたか?これは、ビューのサイズが変更されようとしていることをコンテナに通知するために使用されます。

のObjective-C UITraitEnvironmentの文書を1として

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

スウィフト

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    coordinator.animateAlongsideTransition(nil, completion: { 
    if UIDevice.currentDevice().orientation.isLandscape.boolValue { 
     print("landscape") 
    } else { 
     print("portrait") 
    } 
} 
+0

はい、試しました。それは働いている。しかし、私は変更が終わったときに通知を出したい。とりあえずありがとう。 – RayChen

+0

このチェックをUIDevice.currentDevice()。orientation.isLandscape.boolValueに追加しましたか?これはあなたに現在の向きの状態を与えます。コードを例で更新しました。 –

+0

いいえ、私はそれを確認していない – RayChen

0

IOSのインタフェース環境の変化システムがこのメソッドを呼び出します。このような変更に対応するために、アプリケーションのニーズに応じてビューコントローラとビューにこのメソッドを実装します。たとえば、iPhoneを縦向きから横向きに回転させたときに、View Controllerのサブビューのレイアウトを調整することができます。このメソッドのデフォルト実装は空です。 実装の冒頭で、superを呼び出して、ビュー階層の上位にあるインタフェース要素がレイアウトを最初に調整できるようにします。

9

ViewControllertraitCollectionDidChangeを上書きすることができます。

ただし、

traitCollectionDidChangeスプリットビューモードからスプリットビューモードに変更するときに呼び出されます。例えば、50/50ビューから33/66へ。それでNOTがマルチタスクモードに入ったり終了したりするときに呼び出されます。

あなたの代わりにviewWillTransitionToSize:withTransitionCoordinator:を使用し、入ってくるなど、マルチタスクモードを終了すべてのイベントを処理する必要がある場合:

// put this in your ViewController code  
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
     [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
     // TODO: put your code here (runs BEFORE transition complete) 
    } 

をあなたのコードは、遷移compelete AFTER を呼び出したい場合:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 

    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // TODO: put your code here (runs AFTER transition complete) 
    }]; 
} 
+3

これを読んだ人のヒント。 'traitCollectionDidChange'は、あなたが「50/50ビューから33/66に」と言ったような分割モードを変更したときには必ずしも呼び出されるとは限りません。実際のサイズクラスが変更された場合にのみ呼び出されます。例えば。両方のモードでサイズクラスがコンパクトになるため、iPad proではなくiPadアプリがあり、アプリが右から表示されている場合、traitCollectionDidChangeは呼び出されません。 –

+0

このコメントありがとう!アップル社だけが(ビューサイズの変更を扱う)シンプルなものを作ることができますので、複雑で不明瞭です! –

+0

traitCollectionDidChangeはiPadマルチタスクのためにうまく動作します。 – malhal

2

それでも誰かがその点を疑っている場合:

// This method called every time user changes separator position or when user rotates device 
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    // Always call super in those methods 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    // Before this call your layout is old, status bar orientation will return value before rotation 

    [coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) { 
     // Code here will be executed during transform. Status bar orientation is new, your view size already changed (in general). 
     // Setup required animations or custom views transitions 
    } 
    completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // Split view transition complete or device rotated 
    }]; 
} 

また、メソッドtraitCollectionDidChange:がありますが、実際に水平サイズクラスが変更された場合にのみ呼び出されます。たとえば、スプリットビューモードで右側から提示しているアプリの場合、ユーザーがセパレータの位置を変更したときにtraitCollectionDidChange:は呼び出されません。あなたのアプリは左から提示場合しかし、それはポートレートモードで常に呼び出され、ビューコントローラの遷移(50/50) <-> (66/33)

0

ための風景の中に、私たちは、とき向きが/通知を受けるために

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

を呼び出す必要がありますマルチウィンドウビューの変更。

関連する問題