5

Ho una semplice domanda: Voglio trovare l'altezza di un UINavigationBar in orizzontale mentre il mio dispositivo è in verticale. È possibile e se sì, come?Ottieni UINavigationBar altezza orizzontale mentre il dispositivo è in verticale

Alcuni retroscena:

UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectZero]; 
[navBar sizeToFit]; 

NSLog(@"navBar: %@", NSStringFromCGRect(navBar.frame)); 

Questo restituisce la giusta altezza per l'orientamento dispositivo corrente, per esempio 44. Ciò significa che il metodo sizeToFitsizeToFit deve in qualche modo guardare l'orientamento corrente del dispositivo. C'è un modo per scoprire quale altezza sarebbe nel paesaggio senza andare al paesaggio?

+0

Sarebbe utile sapere perché è necessario sapere questo? – rmaddy

+0

@maddy È un problema teorico. Fondamentalmente mi chiedo solo se sia possibile in qualche modo. –

+0

@rmaddy Ho bisogno anche della cosa esatta. Nel mio caso implemino un 'navigationItem.titleview' personalizzato che deve essere configurato diversamente per le diverse dimensioni' 'navigazioneBar' (orientamenti). 'willAnimateRotationToInterfaceOrientation: duration' è deprecato e' viewWillTransitionToSize: withTransitionCoordinator: 'mostra la vecchia dimensione degli orientamenti non quelli imminenti .. puoi offrire un'idea per questo semplice scopo? – aytunch

risposta

0

OK, questa è una possibile soluzione che funziona:

@interface TestVC : UIViewController 
@property (assign, nonatomic) UIInterfaceOrientationMask orientationMask; 
@end 

@implementation TestVC 
- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return _orientationMask; 
} 
@end 


@implementation ViewController 

- (IBAction)getNavigationBarHeight:(id)sender { 
    TestVC *vc = [[TestVC alloc] init]; 

    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
     vc.orientationMask = UIInterfaceOrientationMaskLandscapeLeft; 
    } else { 
     vc.orientationMask = UIInterfaceOrientationMaskPortrait; 
    } 

    [self presentViewController:vc animated:NO completion:^{ 
     UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectZero]; 

     [navBar sizeToFit]; 

     NSLog(@"navBar frame in 'opposite' orientation: %@", NSStringFromCGRect(navBar.frame)); 

    }]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

@end 
2

Perché non afferrare e impostare tali informazioni in willAnimateRotationToInterfaceOrientation. Sovrascrivendo questo metodo dovresti essere in grado di ottenere le informazioni che desideri prima che la vista venga mostrata.

In altre parole, non preoccuparti di ciò finché non sei in procinto di cambiare orientamento.

willAnimateRotationToInterfaceOrientation

+0

Questo non funziona. Interrogare l'altezza in 'willAnimateRotationToInterfaceOrientation' ti dà l'altezza verticale perché è chiamato ** prima ** la rotazione e il successivo cambio di altezza ha avuto luogo. –

+1

Da Apple doc: quando viene chiamato questo metodo, la proprietà interfaceOrientation è già impostata sul nuovo orientamento e i limiti della vista sono stati modificati. Pertanto, è possibile eseguire qualsiasi layout aggiuntivo richiesto dalle visualizzazioni in questo metodo. – Wizkid

+0

Ah! Colpa mia! Hai ragione! Stavo pensando a willRotateTo ... Ma comunque una rotazione effettiva dovrà essere attivata. Mi stavo chiedendo come farlo dal ritratto senza alcuna rotazione. –