设备处于纵向状态时获取UINavigationBar景观高度

时间:2014-09-10 19:56:28

标签: ios uinavigationbar orientation uiinterfaceorientation landscape-portrait

我有一个简单的问题:我希望在我的设备处于人像状态时找出景观中UINavigationBar的高度。这是可能的,如果是的话,怎么样?

一些背景知识:

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

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

这会返回当前设备方向的正确高度 ,例如44。这意味着UINavigationBar的{​​{1}}方法必须以某种方式查看当前的设备方向。有没有什么方法可以在不去景观的情况下找出景观中的高度

2 个答案:

答案 0 :(得分:2)

为什么不在willAnimateRotationToInterfaceOrientation中抓取并设置该信息。通过重写此方法,您应该能够在显示视图之前获得所需的信息。

换句话说,在您实际上正在改变方向之前,不要担心它。

willAnimateRotationToInterfaceOrientation

答案 1 :(得分:0)

好的,这是一种可行的解决方案:

@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