ios:ランドスケープモードでの2つのViewController間のカスタムSegue

私は2つのUIViewControllerをnavigatoinビューコントローラと両方の横モードで含まれています。私はプッシュのようなアニメーションを持たずに、2つのuiviewcontrollerを切り替える必要があります。したがって、ユーザーが最初のビューコントローラーでボタンをクリックすると、これら2つの間でカスタムセグを実行します。

#import 
#import "AppDelegate.h"

@class AppDelegate;

@interface NonAnimatedSegue : UIStoryboardSegue {

}

@property (nonatomic,assign) AppDelegate* appDelegate;

@end

そしてこれは実装です:

#import "NonAnimatedSegue.h"

@implementation NonAnimatedSegue

@synthesize appDelegate = _appDelegate;

-(void) perform{
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    UIViewController *srcViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destViewController = (UIViewController *) self.destinationViewController;
[srcViewController.view removeFromSuperview];
[self.appDelegate.window addSubview:destViewController.view];
self.appDelegate.window.rootViewController=destViewController;
}

@end

ストーリーボードで私はカスタムセグーに切り替えましたが、実際にはうまくいきます。唯一の問題は、第2の監視コントローラが風景モードで表示されずに表示されることです。私がカスタムsegueを削除し、push segueで置き換えると、すべて正常に動作し、2番目のviewcontrollerはlandscapeモードで表示されます。

だから、私がカスタムセグを使用すると、2番目のviewcontrollerも景観ビューになるようにしなければならないのですか?

14

2 答え

上記のコードは、destinationViewControllerが独自のUIInterfaceOrientationから更新を受け取ることができないため動作しません。これらの更新は、「コンテナビューコントローラ」(ナビゲーションコントローラ)を介して受信されます。カスタムセグが適切に動作するようにするには、Navigation Controllerを使用して新しいビューに移行する必要があります。

-(void) perform{
    [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO];
}
14
追加された
あなたは美しい人間です。
追加された 著者 Mike Speed,

デスティネーション・ビュー・コントローラーにソース・コントローラー(すでに適切に方向付けられている)からセンター/トランスフォーム/境界線を取らせることができます。

-(void) perform{
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;

// match orientation/position
dst.view.center = src.view.center;
dst.view.transform = src.view.transform;
dst.view.bounds = src.view.bounds;

[dst.view removeFromSuperview];
[self.appDelegate.window addSubview:dst.view];
self.appDelegate.window.rootViewController=dst;
}
1
追加された