自动布局-按百分比定位

39

我想沿着一条线绘制点。

跨越屏幕的直线

该线的长度取决于设备和方向,并且始终延伸到整个屏幕。因此,对我来说最有意义的是使用相对百分比值来定位点。

迄今为止,我只发现某种类型的点值 (文档) 定义了限制条件。

是否可以使用百分比值作为约束条件呢?有什么关于以可扩展方式定位这些点的想法吗... 还是必须手动完成这种转换/定位呢?

2个回答

57

是的,你可以将点的位置作为视图宽度的一部分来定位。NSLayoutConstraint方法constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:有一个乘数参数,它允许您在父视图和其子视图之间使用分数关系。父视图的右边缘将是该视图的宽度(如果它是全宽视图,则是屏幕),因此如果您创建像下面这样的约束,点将位于线条的分数距离处:

-(void)viewDidLoad {
      [super viewDidLoad];
      [self.view removeConstraint:self.leftConDark];
      [self.view removeConstraint:self.leftConLight];
      NSLayoutConstraint *lcd = [NSLayoutConstraint constraintWithItem:self.darkButton 
                                                             attribute:NSLayoutAttributeCenterX 
                                                             relatedBy:NSLayoutRelationEqual 
                                                                toItem:self.view 
                                                             attribute:NSLayoutAttributeRight 
                                                            multiplier:.5 
                                                              constant:0];
      NSLayoutConstraint *lcl = [NSLayoutConstraint constraintWithItem:self.lightButton 
                                                             attribute:NSLayoutAttributeCenterX 
                                                             relatedBy:NSLayoutRelationEqual 
                                                                toItem:self.view 
                                                             attribute:NSLayoutAttributeRight 
                                                            multiplier:.9 
                                                              constant:0];
      [self.view addConstraints:@[lcd,lcl]];
}
在这个示例中,我定位了两个UIButtons(信息类型为暗色和亮色)。我在IB中添加了它们,并创建了IBOutlet以便使它们的约束到达视图的左侧(这是系统给我的,也可以到达右侧 - 这无关紧要,因为您可以随时将其删除。如果您要在代码中创建点,则不需要执行此操作)。在代码中,我删除了这些约束,然后添加了新的约束,将按钮的中心放置在屏幕横向距离的50%和90%处。

3
我同意使用 multiplierNSLayoutAttributeRight(尽管我可能会将 NSLayoutAttributeCenterX 修改为 NSLayoutAttributeRight,但无疑Bernd已经明白了)。很好。 - Rob
@Rob,感谢您的纠正--有时我会忘记关于框架和边界方面的更新时间。我曾经认为,视图的NSLayoutAttributeRight在旋转时不会反映正确的值,除非代码在viewWillLayoutSubviews中。 - rdelmar
1
@Rob,再次感谢--不需要原谅,我仍在努力理解布局约束。我已经更新了答案。 - rdelmar
1
您不需要直接删除约束。在IB中,逐个选择“占位符”约束(单击齿轮向下箭头并选择“选择并编辑...”),然后勾选“构建时删除”框即可。 - capikaw
3
@Isuru,现在在IB中可以这样做(我不确定在我写这个答案时是否可行)。将视图的中心X和父视图的尾部之间设置约束。编辑约束,将其乘数设置为您希望视图放置在屏幕上横向位置的分数。将常数设置为0。 - rdelmar
显示剩余3条评论

13

我不是一个自动布局的专家(甚至还不够熟练!)但从XCode 6开始,似乎可以在IB中实现这个。

  1. 选择对象。
  2. 显示尺寸检查器(点击标尺)size inspector

  3. 双击约束矩形(不明显!“编辑”会带你到其他地方)

constraint rectangle

  1. 在这里,您可以像上面的答案一样设置乘数。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接