ios: пользовательский переход между двумя контроллерами вида в ландшафтном режиме - PullRequest
14 голосов
/ 24 ноября 2011

У меня есть два контроллера UIViewController, которые содержатся в контроллере представления Navatoin и оба в альбомном режиме. Я хочу переключаться между двумя uiviewcontroller без анимации, как push. Поэтому я выполняю пользовательский переход между этими двумя, если пользователь нажимает кнопку в первом контроллере вида.

#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

В раскадровке я переключился на кастомный переход, и на самом деле он работает нормально. Единственная проблема заключается в том, что второй контроллер uiview отображается не в ландшафтном режиме, а в режиме protrait. Если я удаляю пользовательский переход и заменяю его на push-переход, то все работает нормально, второй контроллер представления отображается в альбомном режиме.

Итак, что мне нужно сделать, чтобы второй viewcontroller был также в альбомной ориентации, если я использую свой пользовательский переход?

Ответы [ 2 ]

14 голосов
/ 25 ноября 2011

Приведенный выше код не работает, так как destinationViewController не может получать обновления от UIInterfaceOrientation самостоятельно.Он получает эти обновления через «Контейнер представления контейнера» (контроллер навигации).Чтобы заставить пользовательский переход работать должным образом, нам нужно перейти к новому представлению через контроллер навигации.

-(void) perform{
    [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO];
}
1 голос
/ 02 февраля 2012

вы можете заставить контроллер вида назначения брать центр / преобразование / границы от контроллера источника (который уже ориентирован правильно):

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