我正在开发通用iOS应用程序。
我想要的是我的所有视图都会根据屏幕sisze自动调整大小,我的意思是我不想硬编码任何CGRect
尺寸或使用Interface Builder;我正在使用一个特定的应用程序示例,但我非常感谢在许多类似场景中可用的答案。
这是一个非常简单的应用程序,但我希望答案可以告诉我如何为我的所有视图执行此操作,以便他们可以调整到任何大小。
对于这个特定的应用程序,我正在构建一些看起来像这样的东西:
这是一个特别棘手的例子,因为MKMapView必须用框架初始化,但我希望你能帮助我。
我遇到的第一个问题是我的loadView方法:
MKMapView *mapView=[[MKMapView alloc ] initWithFrame:CGRectZero];
mapView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
self.view=mapView;
除非视图控制器由UINavigationController
管理,否则自动调整掩码不起作用;我不知道为什么。
当我想在屏幕底部添加我的UIToolbar时,会出现下一个问题。
为了做到这一点,我做了以下几点:
UIToolbar *toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, 420, 320, 40)];
toolBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.view addSubview:toolBar];
这与iPhone完美配合,但不适用于iPad(工具栏的宽度已经调整,但显然屏幕底部没有显示),因为尺寸是硬编码的。
很抱歉发布这么长的问题,但我认为答案对我和其他有需要的开发人员来说是一个很好的资源。
如果我不清楚,请告诉我。
答案 0 :(得分:4)
在处理iOS视图几何时,CGGeometry
中定义的某些函数非常有用。
假设您想要整个框架并分为两部分。底部应该是位于屏幕底部的工具栏框架,高44像素。顶部的剩余部分应全部给予地图。执行此操作的有用功能是CGRectDivide
,其定义为:
void CGRectDivide (
CGRect rect,
CGRect *slice,
CGRect *remainder,
CGFloat amount,
CGRectEdge edge
);
你传递完整的CGRect,两个未初始化的CGRect,将在分割后填充正确的帧大小,从中开始的边缘(左,右,顶部,底部)以及距边缘的距离。
玩unicode艺术,这是我能做的最好的。完整的rect分为两部分。底部的黑线是工具栏的框架。白色矩形是地图获得的框架。
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
CGRect mapFrame, toolbarFrame;
CGRectDivide(appFrame, &toolbarFrame, &mapFrame, 44, CGRectMaxYEdge);
// map is an MKMapView
map.frame = mapFrame;
// toolbar is a UIToolbar
toolbar.frame = toolbarFrame;
以下是它在iPhone和iPad模拟器上的外观。
答案 1 :(得分:1)
对于工具栏,你可以像这样计算它的框架:
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGRect toolbarFrame = CGRectMake(CGRectGetMinX(applicationFrame), CGRectGetMaxY(applicationFrame) - 44.0, applicationFrame.size.width, 44.0)
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame];
如果你的UIToolbar不应该扩展屏幕的宽度,而是扩展视图,只需将applicationFrame设置为该视图的框架。