ios:横向模式下两个viewcontrollers之间的自定义Segue

时间:2011-11-24 17:49:03

标签: ios uiviewcontroller push

我有两个UIViewControllers,它们包含在navigatoin视图控制器中,并且都处于横向模式。我想在没有像push这样的动画的情况下在两个uiviewcontroller之间切换。因此,如果用户在第一个viewcontroller中单击一个按钮,我会在这两者之间执行自定义segue。

#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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

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

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