制作通用ViewControllers

时间:2011-02-16 23:35:41

标签: iphone ipad ios uiview uiviewcontroller

我正在开发通用iOS应用程序。

我想要的是我的所有视图都会根据屏幕sisze自动调整大小,我的意思是我不想硬编码任何CGRect尺寸或使用Interface Builder;我正在使用一个特定的应用程序示例,但我非常感谢在许多类似场景中可用的答案。

这是一个非常简单的应用程序,但我希望答案可以告诉我如何为我的所有视图执行此操作,以便他们可以调整到任何大小。

对于这个特定的应用程序,我正在构建一些看起来像这样的东西:

A simple mockup of a screen used in my app.

这是一个特别棘手的例子,因为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(工具栏的宽度已经调整,但显然屏幕底部没有显示),因为尺寸是硬编码的。

很抱歉发布这么长的问题,但我认为答案对我和其他有需要的开发人员来说是一个很好的资源。

如果我不清楚,请告诉我。

2 个答案:

答案 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模拟器上的外观。

enter image description here enter image description here

答案 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设置为该视图的框架。