1

我正在编写一个 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

4 回答 4

1

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

实例方法:

这假设您的视图控制器(自身)嵌入在导航控制器中。

-(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)。

于 2014-08-18T21:12:14.133 回答
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;
}
于 2012-05-18T01:56:30.130 回答
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];

于 2012-05-18T00:59:21.250 回答
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;
于 2013-08-07T15:48:31.677 回答