iPhone Dev - UIView框架和loadView

时间:2009-08-13 00:14:07

标签: iphone user-interface uiview uiviewcontroller 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 ..可以理解它的人请解释它我?谢谢!

好的,这很奇怪......这个:

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

???那是什么?

3 个答案:

答案 0 :(得分:5)

首先要注意的是CGRect的origin和size成员使用float,因此在NSLog语句中你需要使用%f,而不是%d。例如,

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

答案 1 :(得分:0)

像素大小是浮动的,因为在桌面上进行缩放时需要精确的数学运算,并希望支持按比例调整大小。如果你坚持使用整数并且窗口大小扩大了,例如1.2倍,则整数舍入会使事情变得不合适。他们在iPhone上保留了同样的东西,因为你可以拥有自动调整尺寸的子视图,并且花车可以更好地控制尺寸和位置。

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

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

很多IB号码都是相对定位的。将视图添加到navcontroller或tabview时,此视图将成为这些父视图的子视图,默认情况下会自动调整子视图。因此,如果您已经“模拟”了IB中的顶部栏,您的控件应该正确排列并流入正确的位置,您应该看到您的期望(当然,取决于父控件最终会显示您的子视图作为一个孩子)。

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

答案 2 :(得分:0)

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