8

На iOS 8 У меня странное поведение в отношении навигационной панели и изменений ориентации.iOS 8: Представление контроллера модального вида в портрете вызывает изменение размера навигационной панели базового контроллера ландшафтной навигации

У меня есть контроллер навигации, который сообщает о поддерживаемой ориентации интерфейса UIInterfaceOrientationMaskLandscapeRight. Навигационная панель имеет ожидаемую высоту для альбомной ориентации (к сожалению, я не имею права опубликовать скриншоты).

Затем я инициирую модальное представление контроллера вида, который поддерживает только UIInterfaceOrientationMaskPortrait. Когда начинается анимация презентации, кажется, что метрики основного навигационного контроллера изменены на портретную презентацию, так как высота навигационной панели увеличивается до размера его портрета, как показано выше.

iOS 7 не проявляет такого поведения. Что мне не хватает? Я хочу восстановить прежнее поведение.

Вот полный код простого примера выше:

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 


    DOGButtonViewController *root = [DOGButtonViewController new]; 
    DOGOrientedNavigationController *navi = [[DOGOrientedNavigationController alloc] initWithRootViewController:root]; 
    navi.allowedInterfaceOrientations = UIInterfaceOrientationMaskLandscapeRight; 

    self.window.rootViewController = navi; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait; 
} 

@end 


@implementation DOGOrientedNavigationController 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.allowedInterfaceOrientations; 
} 

@end 

@implementation DOGButtonViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"Button View Controller"; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    DOGPortraitViewController *vc = [DOGPortraitViewController new]; 
    [self presentViewController:vc animated:YES completion:nil]; 
} 

@end 

@implementation DOGPortraitViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"Portrait Title"; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

@end 

В более сложной настройке я также опыт текста в UIWebView, содержащемся в навигационном контроллере масштабируется, когда представляя портрет модальность. При утере модальности текст не изменяется до первоначального размера.

+0

Удалось ли вам найти решение этой проблемы? Я испытываю то же самое –

+0

К сожалению нет, но я посмотрю на это в ближайшие дни. – thewulf

+0

Аналогичная проблема здесь. Похоже, контроллер представления также вращается (хотя это не должно) – Carlos

ответ

0

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

Очевидно, что я должен удалить этот снимок экрана, когда представление вновь появляется

func showScreenShot() { 
    let image = screenShot() 
    self.screenShotImageView = UIImageView(image: image) 
    self.view.addSubview(self.screenShotImageView!) 
    } 

func screenShot() -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, UIScreen.mainScreen().scale) 
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image 
} 

func removeScreenShot() { 
    if let screenImageView = self.screenShotImageView { 
    screenImageView.removeFromSuperview() 
    self.screenShotImageView = nil 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^