如何布置项目“相对”而不是绝对位置?

时间:2011-06-29 13:20:39

标签: iphone objective-c ios

布局iPhone UI项目的最佳方法是什么?现在我正在使用CGRectMake并指定每个UI项目(标签,视图,按钮等)的确切x和y坐标,并将每个UI项目添加到当前视图。

我看到的一个问题是,如果其中一个项目改变了高度或宽度,我将不得不调整其他UI项目的x和y坐标,因此维护将是一个挑战。

有替代方法吗?在HTML / CSS中,我习惯于使用边距而不是绝对定位来相对于彼此放置项目。你建议我做些什么来保持维护容易和无压力?

4 个答案:

答案 0 :(得分:1)

没有。据我所知,在iOS中不可能使用相对布局。您可以使用界面构建器来设计UI,这样可以更轻松地定位UI元素。

您还可以考虑使用 UIView autoResizingMask属性。是的,

  

一个整数位掩码,用于确定接收器在超视图边界发生变化时如何调整自身大小。

答案 1 :(得分:1)

我认为没有一种自动方式来实现这一目标 我认为你唯一的选择就是编写一个方法,但即使这样做也很棘手,你需要确定受影响的元素并知道要重新定位的元素(参见下面的一个非常简单的例子)。

-(void)adjustUIElements:(CGSize)newSize{

    //for example
    button1.frame = CGRectMake(
        (button1.frame.origin.x + newSize.width), 
        (button1.frame.origin.y + newSize.height), 
        button1.frame.size.width, 
        button1.frame.size.height);

    //etc.
}

这个例子的好处在于,只要尺寸发生变化,你就可以运行它。它需要一段时间才能正确,但是你可以在你认为合适的任何功能中重复使用它。

答案 2 :(得分:1)

我一直在做的是使用全局常量来设置高度,宽度,xoffset和yoffsets。例如。我知道我想要彼此相邻的2个按钮,A和B,其中A是20,20来自原点,B是20右边A:
Constants.m:

CGFloat buttonHeight = 50, buttonWidth = 100;
CGFloat buttonAXoffset = 20, buttonAYoffset = 0;
CGFloat buttonBXoffset = 20, buttonBYoffset = 0;
CGFloat initialXoffset = 0, initialYoffset = 20;

(并使用Constants.h用extern CGFloat blah声明它们)
要绘制按钮,请设置CGFloat creatorCursorX = initialXoffset, creatorCursorY = initialYoffset;这将是您的相对光标 然后,在创建按钮A的上方,执行creatorCursorX += buttonAXoffset; creatorCursorY += buttonAYOffset;,并使用creatorCursorXcreatorCursorY设置其位置buttonHeightbuttonWidth 创建按钮A后,执行creatorCursorX += buttonWidth;

因此,当您开始制作按钮B时,您已经有了一个光标,您可以使用该光标相对于按钮A放置按钮B,就像上面一样。之前添加偏移量,之后添加大小。这样可以轻松切换按钮(和其他布局项目) 您也可以编辑此方法以将项目放在屏幕上 顺便说一句,要在新行上开始光标,只需再次设置creatorCursorX = initialXoffset并将Y距离添加到creatorCursorY

我不是这方面的专家,但我发现这种方法效率最高,以后可以轻松调整。无需筛选代码,只需按顺序对块进行调整,然后转到Constants.m更改大小。

答案 3 :(得分:0)

我无法在面向公众的Apple网站上找到任何关于它的内容,但我在其中一个谣言网站上看到Apple将在Lion推出一个名为Cocoa Autolayout的新布局系统。不幸的是,它不适用于下一个iOS版本。

我不想链接到任何特定文档,但在您最喜欢的搜索引擎上搜索“Cocoa Autolayout”会给您一些关于自动布局如何工作的一般信息。

如果您是已注册的iOS开发人员,则应该可以访问该主题的其中一个WWDC会话。