Ios: Пользовательский Segue между двумя viewcontrollers в ландшафтном режиме
У меня есть два UIViewControllers, которые содержатся в контроллере просмотра navigatoin и оба в ландшафтном режиме. Я хочу переключиться между двумя uiviewcontroller, не имея анимации, такой как push. Поэтому я выполняю пользовательский 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 отображается в альбомном режиме.
Итак, что мне нужно сделать, чтобы второй viewcontroller также был в ландшафтном представлении, если я использую свой пользовательский segue?
Ответы
Ответ 1
Код выше не работает, потому что destinationViewController не может получать обновления от UIInterfaceOrientation самостоятельно. Он получает эти обновления через него "Контроллер контейнера" (контроллер навигации). Чтобы пользовательский segue работал правильно, нам нужно перейти к новому представлению через контроллер навигации.
-(void) perform{
[[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO];
}
Ответ 2
у вас может быть контроллер представления назначения, который принимает центр/преобразование/границы из исходного контроллера (который уже ориентирован правильно):
-(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;
}