iPhone开发 - UIView框架和loadView

问题描述:

我正在学习为iPhone开发(编程方式,我不喜欢IB)。我只用IB来处理事物的框架,所以我用IB来设计,但只用它来检查每个控件的框架。我非常困惑的是UIView的框架。首先,如果你没有在视图控制器中实现loadView,它会自动创建一个空的UIView(并且我注意到它的黑色),并将它指定给self.view,是否正确?那框架呢?它会自动找出框架应该是什么?我的意思是,它需要有所不同,具体取决于是否有状态栏,是否有标签栏,工具栏和方向。在我的标签栏应用程序中,似乎无论我设置了我的uiview框架,它仍然看起来不错。而且,UIView的帧看起来在IB中搞砸了。类似于UIView占据整个窗口(状态栏除外)的y值是0,应该是20时,因为状态栏占据了前20个像素。在IB中,标签栏控制器中的视图的y值为411,即使它在状态栏下正好开始。每当我NSLog框架(四个数字,view.frame.origin.x,view.frame等),x,y,宽度和高度总是0 ..谁能理解它的人请解释它我?谢谢!!iPhone开发 - UIView框架和loadView

好吧,这是奇怪...这:

CGRect test = CGRectMake(0, 20, 320, 460); 
NSLog(@"%d %d %d %d", test.origin.x, test.origin.y, CGRectGetWidth(test), CGRectGetHeight(test)); 

给输出:

0 0 0 1077149696 

???那是什么?

答:IB并不总是显示正确的原点/位置坐标,有些东西,如UITabBarController,将视图的大小调整为无论你设定了什么,都要成为他们想要的东西。

你应该注意的第一件事是CGRect的起源和大小成员使用float,所以在你的NSLog语句中你需要使用%f而不是%d。因此,例如,

NSLog(@"%f %f %f %f", test.origin.x, test.origin.y, test.size.width, test.size.height); 
+0

谢谢,他们现在显示正确的数字。但是我的其余问题呢? – mk12 2009-08-13 14:07:36

+0

虽然他们漂浮,但是..每个1.0代表1像素,并且您不能有半个像素。 – mk12 2009-08-13 14:14:25

+0

当我有权访问一个mac盒子时,我会研究您的问题的其余部分。至于浮点使用,你将不得不问问苹果这个问题:) – keno 2009-08-13 14:30:28

像素大小是花车,因为你做的缩放和想支持比例上浆时,需要精确的数学在桌面上。如果你坚持使用整数,并且窗口大小扩大了1.2倍,那么整数舍入会抛出异常。他们在iPhone上保持相同的功能,因为您可以拥有自动调整大小的子视图,并且浮动功能可以更好地控制大小和位置。

至于视图位置,如果进入IB并选择视图并选中“视图属性”检查器,您将看到其中一个选项是显示“模拟界面元素”。默认情况下,它启用了状态栏(带有灰色),并允许在界面中显示其高度。如果在检查器中检查大小选项卡,则视图高度实际上设置为460(允许20像素状态栏)。

您可以选择包含顶部栏或底部栏,它会通过为您调整内容高度来“模拟”这些内容。这只是一个定位模拟,因此您可以布置控件。在运行时,假设你将视图加载到合适的视图控制器中,该视图控制器将具有适当的chrome,因此它应该都看起来正确。

大量的IB号码用于相对定位。当您将视图添加到navcontroller或tabview时,此视图将成为这些父视图的子视图,并且默认情况下它们会自动调整子视图的大小。因此,如果您已经在IB中对*栏进行了“模拟”,则应该将所有控件都排好并流入正确的位置,并且您应该看到您期望的内容(当然,取决于子控件的父控件的最终结果作为一个孩子)。

顺便说一句,你错过了很多便利,因为不使用IB来连接控件并将它们连接到IBOutlets。它确实有助于消除大量的手动工作和额外的代码。这就像超人拒绝使用他的X射线视觉,而是决定冲破墙壁:-)

+0

但如何进入IB,例如,如果你有一个窗口,窗口内的一个视图,其正确的320乘460,20像素的状态栏,但Y坐标是0,当它应该是20 ..至于使用IB,我并没有真正看到它的简单iPhone UI的重点,我认为这对复杂的桌面应用程序更好。而且它更加令人满意,因为知道它是我编码的100%:-)。 – mk12 2009-08-18 22:22:13

+0

我相信IB显示边界坐标(局部坐标)而不是框架(父坐标)。所以在父坐标中,一个视图可能在y = 20处,但是在它自己的坐标中,它在y = 0处,大小相同(如果它正在模拟状态栏)。 – Ramin 2009-08-19 04:16:49

+0

它在下拉框中表示'框架'和'布局'和'框架'被选中...如果它是界限,它应该说'界限'。但我猜如果这是另一个笔尖,它不知道父母的观点是什么......我不知道。 – mk12 2009-08-21 02:48:56