iOS:横屏模式下两个视图控制器之间的自定义转场

14

我有两个UIViewControllers,都在导航视图控制器中并处于横向模式。我想在两个uiviewcontroller之间切换而不需要像推一样进行动画。因此,如果用户在第一个视图控制器中单击按钮,则执行这两个之间的自定义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

我在storyboard中切换到了自定义segue,实际上它的工作正常。唯一的问题是第二个uiviewcontroller不是以横向模式而是纵向模式显示。如果我删除自定义segue并将其替换为push segue,则一切都正常工作,第二个viewcontroller会以横向模式显示。

那么,如果我使用自定义segue,我该怎么做才能使第二个viewcontroller也以横向视图显示?

2个回答

14

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接