我正在编写一个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分辨率。一旦我知道确切的可用区域,我就可以处理缩放问题。为什么这么难?救命!!
答案 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)。