状态栏和导航栏后可用的视图大小

时间:2012-05-18 00:46:30

标签: ios ipad

我正在编写一个iPad应用程序,需要知道视图的可用区域以进行绘图。视图被添加到导航控制器中,因此我的状态栏和导航控制器都占用了一定数量的像素。我的应用程序恰好处于横向模式,虽然我不认为这是相关的。

我可以使用didRotateFromInterfaceOrientation在旋转后获得正确的视图大小。但是如果没有旋转屏幕,我无法弄清楚如何做到这一点。

 - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    NSLog(@"drfi %d %d", (int)self.view.frame.size.width, (int)self.view.frame.size.height);

}
旋转后工作的

^^。不是之前。无法弄清楚如何获得准确的数字。我真的不想硬连线。

我还需要此功能与设备无关 - 它应该适用于新iPad以及较旧的iPad分辨率。一旦我知道确切的可用区域,我就可以处理缩放问题。为什么这么难?救命!!

4 个答案:

答案 0 :(得分:1)

我认为您不需要在didRotateFromInterfaceOrientation中指定框架的视图,而是我建议的是将一些属性设置为视图自动调整遮罩,以便根据您的视图方向自动调整其大小。

通过在加载视图时将其设置为您的视图(viewDidLoad方法):

self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

指定您的视图会自动更改其宽度和高度,并可以获得您需要的正确值。

你应该读到这个:http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html#//apple_ref/doc/uid/TP40009503-CH5-SW1 为了更好地理解iOS中的视图

修改

此外,您可能希望了解可以使用[[UIApplication sharedApplication] statusBarOrientation];

完成设备的方向

答案 1 :(得分:1)

你的应用程序看起来像:有一个启动视图,然后在这个视图中你将加载并在窗口中添加一个主视图,对吧?然后,您应该在主视图中执行以下操作:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        CGRect frame = self.view.frame;
        frame.origin.y = frame.origin.y + 20.0;
        self.view.frame = frame;
    }
    return self;
}

答案 2 :(得分:1)

试试这个。

CGRect frame = [UIScreen mainScreen].bounds;
CGRect navFrame = [[self.navigationController navigationBar] frame];
/* navFrame.origin.y is the status bar's height and navFrame.size.height is navigation bar's height.
So you can get usable view frame like this */
frame.size.height -= navFrame.origin.y + navFrame.size.height;

答案 3 :(得分:1)

您可以通过将实例方法与类别方法相结合来动态获取此内容:

实例方法:

这假定您的视图控制器(self)嵌入在导航控制器中。

-(int)getUsableFrameHeight {
  // get the current frame height not including the navigationBar or statusBar
  return [MenuViewController screenHeight] - [self.navigationController navigationBar].frame.size.height;
}

班级类别方法:

+(CGFloat)screenHeight {
    CGFloat screenHeight;
    // it is important to do this after presentModalViewController:animated:
    if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait ||
        [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
        screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
    } else {
        screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
    }
    return screenHeight;
}

在纵向和横向移除状态栏和导航栏后,上面将始终为您提供可用的框架高度。

注意:类方法会自动扣除20 pt的状态栏 - 然后我们只需减去导航标题变量高度(横向为32 pt,纵向为44 pt)。