【发布时间】:2013-03-23 17:58:48
【问题描述】:
我对 Cocoa 自动布局有疑问,无法解决这个问题。 我想要实现的只是让两个按钮始终位于视图的中心,如下所示。
我尝试了很多不同的方法,但都没有成功:(请在这里帮助我。
【问题讨论】:
-
天哪!这太聪明了!但我猜对于奇数个按钮,方法会相似但略有不同,对吧?
标签: ios6 autolayout
我对 Cocoa 自动布局有疑问,无法解决这个问题。 我想要实现的只是让两个按钮始终位于视图的中心,如下所示。
我尝试了很多不同的方法,但都没有成功:(请在这里帮助我。
【问题讨论】:
标签: ios6 autolayout
我是凭记忆写的,希望所有信息都是正确的。我正在使用 XCode5。这是我最终从没有限制开始这样做的方式:
选择两个按钮并添加约束以设置它们的高度和 “添加新约束”窗口中的宽度,可从第二个访问 IB 画布右下角的按钮。
两个按钮仍处于选中状态添加约束以设置它们的 Y 位置。 Add New 中的上方空格或下方空格 约束窗口就可以了。
现在选择按钮 1 并 添加对齐约束“水平 在“添加新对齐约束”窗口中居中” 可从 IB 画布右下角的第一个按钮访问。 默认情况下,添加约束的“常量”值为 0。我们 想要改变它,因为它是错误的。
此时按钮 1 将有一个垂直运行的黄条 通过这。这是一个警告,表明水平中心 按钮的不等于容器的水平中心 + 约束的常数 (0)。垂直条上的 数字 是按钮离中心的距离。记住那个号码。
双击按钮 1 上的黄色竖条(灵巧度 必需)或选择按钮 1 转到左侧窗格并单击 标尺和“选择并编辑”名为“对齐中心 X”的约束 到:”。
在标有“常数”的文本框中输入第 4 步中的数字。 Button 1 现在已经满足了它需要的所有约束 展示。它有一个宽度,高度,Y(顶部空间或底部空间 约束),现在是 X(水平中心对齐)。按钮 2, 但是仍然缺少它可以背负的 X 位置 按钮 1。
选择按钮 2,转到 Add New Constraints 窗口并简单地设置 按钮 1 的前导空间(顶部白框的左侧栏)。
您现在应该有两个按钮,它们将始终以固定宽度保持在其容器的中心。
【讨论】:
自动布局的一个巧妙技巧是使用不可见的视图作为分隔符。约束系统仍然照常布置它们。在这种情况下,两个按钮之间的空间可以是一个不可见的视图。您可以使用此约束字符串中的约束:
@"[button][invisibleView(5)][button2(==button)]"
然后创建一个约束设置invisibleView.centerX = superview.centerX。
【讨论】:
这样做的另一个技巧是将button 的右侧对齐到远离superview 中心的空间大小的一半,将button2 的左侧对齐到空间大小的一半远离superview 中心的空间。
这只有在你有一个只围绕你想要居中的两个视图的超级视图时才真正有效。
【讨论】:
如果您有固定宽度的按钮并且希望两个按钮之间的距离固定,那么以下步骤可以完成工作:
Width 和Height constraint 添加到button1 示例值:100 高度和 100 宽度。constraint Equal Widths 和Equal Heights。button1 和button2 之间添加Horizontal Spacing。或者我们可以说从button1 中添加Leading Space 到button2。示例值:150button1 并添加constraint Horizontally in Container 和-125 值。 constrains,如Vertical Spacing to Container等。示例值 125 等于 (button1 width / 2) + (Horizontal Spacing/2) 即 100/2 + 150/2 = 125。
因此,将 Horizontal in Container 添加到 -125 会将 buttons 向左移动,这将使此布局在屏幕中居中。
【讨论】:
基本上,我的UITableViewCell 中有两个UIButtons 位于下方,需要始终居中且宽度相同。这就是我让它在 Xcode 7.2 中工作的方式。顺便说一句,我正在使用 Swift,如果这有任何关系的话。
【讨论】:
您也可以通过以下方式实现。
1.左键为前导空格,右键为尾随空格。
2.为前导和尾随约束构造出口。
__weak IBOutlet NSLayoutConstraint *leadingConstraint;
__weak IBOutlet NSLayoutConstraint *trailingConstraint;
3.计算常数如下式。
NSInteger constant = (SCREEN_WIDTH - (CGRectGetWidth(leftButton.frame) + CGRectGetWidth(rightButton.frame))) / 3;
leadingConstraint.constant = constant;
trailingConstraint.constant = constant;
希望对你有帮助。
【讨论】:
很棒的提示。 就我而言,我希望按钮与视图中心相距 10 像素,所以我的数学略有不同
leadingConstraint.constant = (self.frame.size.width / 2.0) + 5.0;
trailingConstraint.constant = (self.frame.size.width / 2.0) + 5.0;
【讨论】: