5

Ich habe eine einfache Frage: Ich möchte die Höhe eines UINavigationBar in Landschaft, während mein Gerät im Hochformat ist. Ist das möglich und wenn ja, wie?Holen Sie sich UINavigationBar Querformat Höhe, während Gerät im Hochformat ist

Einige Hintergrundinformationen:

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

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

Dies gibt die richtige Höhe für die aktuelle Geräteausrichtung zum Beispiel 44. Das bedeutet, dass die Methode UINavigationBarsizeToFit irgendwie auf die aktuelle Geräteausrichtung aussehen muss. Gibt es eine Möglichkeit, herauszufinden, , was wäre die Höhe in Landschaft, ohne in die Landschaft zu gehen?

+0

Es würde helfen wissen, warum Sie dies wissen müssen? – rmaddy

+0

@maddy Es ist ein theoretisches Problem. Ich frage mich im Grunde nur, ob es irgendwie möglich ist. –

+0

@rmaddy Ich brauche das genaue Ding auch. In meinem Fall implementiere ich ein benutzerdefiniertes 'navigationItem.titleview' welches für verschiedene' navigationBar' Größen (Ausrichtungen) unterschiedlich konfiguriert werden muss. 'willAnimateRotationToInterfaceOrientation: duration' ist veraltet und' viewWillTransitionToSize: withTransitionCoordinator: 'zeigt die alte Orientierungsgröße an, nicht die kommenden. Können Sie eine Idee für diesen einfachen Zweck anbieten? – aytunch

Antwort

0

OK, das ist eine mögliche Lösung, die funktioniert:

@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

Warum greifen Sie nicht und setzen Sie diese Informationen in willAnimateRotationToInterfaceOrientation. Wenn Sie diese Methode überschreiben, sollten Sie in der Lage sein, die gewünschten Informationen zu erhalten, bevor die Ansicht angezeigt wird.

Mit anderen Worten, mach dir keine Sorgen darüber, bis du gerade dabei bist, deine Orientierung zu ändern.

willAnimateRotationToInterfaceOrientation

+0

Das funktioniert nicht. Wenn Sie die Höhe in 'willAnateRotationToInterfaceOrientation' abfragen, erhalten Sie die Höhe des Portraits, weil es ** genannt wird ** bevor ** die Rotation und die anschließende Höhenänderung stattgefunden haben. –

+1

Von Apple doc: Wenn diese Methode aufgerufen wird, ist die Eigenschaft interfaceOrientation bereits auf die neue Ausrichtung eingestellt, und die Grenzen der Ansicht wurden geändert. Auf diese Weise können Sie jedes zusätzliche Layout ausführen, das für Ihre Ansichten in dieser Methode erforderlich ist. – Wizkid

+0

Ah! Mein Fehler! Sie haben Recht! Ich dachte an willRotateTo ... Aber trotzdem muss eine tatsächliche Rotation ausgelöst werden. Ich habe mich gefragt, wie man es von einem Porträt ohne jegliche Drehung macht. –