8

Su iOS 8 ho uno strano comportamento riguardo alla barra di navigazione e alle modifiche di orientamento.iOS 8: la presentazione di un controller di visualizzazione modale in verticale provoca il ridimensionamento della barra di navigazione del controller di navigazione orizzontale sottostante

Ho un controller di navigazione che segnala un orientamento di interfaccia supportato UIInterfaceOrientationMaskLandscapeRight. La barra di navigazione ha l'altezza prevista per l'orientamento orizzontale (purtroppo non ho il diritto di pubblicare schermate).

Quindi avvio una presentazione modale di un controller di visualizzazione che supporta solo UIInterfaceOrientationMaskPortrait. Quando inizia l'animazione della presentazione, sembra che le metriche del controller di navigazione sottostante vengano trasformate in una presentazione verticale, man mano che l'altezza della barra di navigazione aumenta fino alla dimensione verticale, come illustrato sopra.

iOS 7 non presenta questo comportamento. Cosa mi manca? Voglio ripristinare il vecchio comportamento.

Ecco il codice completo della semplice esempio di cui sopra:

@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 

In una configurazione più complessa anche io sperimento il testo in un UIWebView contenuta nel controller di navigazione viene scalato fino al momento di presentare il modal ritratto. Quando si elimina la modale, il testo non viene ridimensionato alla sua dimensione originale.

+0

Siete riusciti a trovare una soluzione a questo? Sto vivendo la stessa cosa –

+0

Purtroppo no, ma esaminerò questo nei prossimi giorni. – thewulf

+0

Problema simile qui. Sembra che anche il controller della vista che presenta ruota (anche se non dovrebbe) – Carlos

risposta

0

Per mancanza di un'opzione migliore ho fatto un po 'di trucco per questo. Fondamentalmente prima di mostrare la vista modale faccio uno screenshot e lo metto sopra il controller della vista che presenta.

Ovviamente devo togliere shot schermo quando la vista riappare

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