ios:风景模式下两个视图控制器之间的自定义Segue

我有两个UIViewController包含在navigatoin视图控制器,并在横向模式。 我想在两个uiviewcontroller之间切换,而不需要像push这样的animation。 因此,如果用户在第一个视图控制器中单击一个button,则在这两者之间执行自定义search。

#import <Foundation/Foundation.h> #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 

在故事板我切换到自定义赛格,实际上它工作正常。 唯一的问题是第二个uiviewcontroller不是以横向模式显示,而是在protrait。 如果我删除了自定义的segue并将其replace为push segue,那么一切正常,第二个viewcontroller以横向模式显示。

那么,如果我使用自定义的segue,那么我还需要做什么才能使第二个viewcontroller也处于横向视图中?

上面的代码不起作用,因为destinationViewController无法从UIInterfaceOrientation自己接收更新。 它通过它的“容器视图控制器”(导航控制器)接收这些更新。 为了使自定义的segue正常工作,我们需要通过导航控制器转换到新的视图。

 -(void) perform{ [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO]; } 

您可以让目标视图控制器从源控制器(已经正确定位)获取中心/变换/边界:

 -(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; }