【问题标题】:Auto layout: constraint that involves multiple items自动布局:涉及多个项目的约束
【发布时间】:2015-09-18 17:53:29
【问题描述】:

例如,我希望将某个文本字段放置在导航栏下方,距离等于超级视图总高度的四分之一。这涉及三个项目:文本字段、顶部布局指南和超级视图。如何在 Interface Builder 中或通过编程创建这样的约束?

【问题讨论】:

  • 一种方法是创建约束的 oulet 引用并在 viewWillLayoutSubviews 中以编程方式更改其常量值(成为超级视图的四分之一高度)
  • @BenjaminJimenez:在这种特定情况下,这是可行的,因为超级视图永远不会改变。但是更一般的情况呢?比如常量是另一个文本字段的属性,也可以通过自动布局系统进行调整?
  • @BenjaminJimenez:从头开始。当用户旋转设备时,superview 会发生变化。
  • 是的,但是当用户旋转 viewWillLayoutSubviews 时再次调用,所以现在它将是旋转视图的 1/4

标签: ios objective-c cocoa-touch user-interface autolayout


【解决方案1】:

不可能只使用一个约束。相反,您需要在文本字段上方创建一个额外的UIView。然后你可以设置以下约束:

  1. 4 * extraView.height = containerView.height
  2. extraView.top = topLayoutGuide
  3. extraView.bottom = textField.top

【讨论】:

  • UILayoutGuide 比假人 UIView 好。
【解决方案2】:

每次你需要这样的东西,并且不想使用本杰明的技术时,使用等宽或等高约束到超级视图的乘数属性。

【讨论】:

    【解决方案3】:

    我这样做的方法是使用 constraintsWithVisualFormat。像这样:

    double quarterSuperViewHeight = superView.frame.size.height / 4;
    NSDictionary* metrics = NSDictionaryOfVariableBindings(quarterSuperViewHeight);
    NSDictionary* views = NSDictionaryOfVariableBindings(textField, navigationBar);
    [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[navigationBar]-quarterSuperViewHeight-[textField]" options:0 metrics:metrics: views:views];
    

    这应该将导航栏和文本字段之间的空间设置为超级视图高度的四分之一。现在我不太记得您是否必须在每次设备旋转时重做此布局,但我认为您不应该这样做。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多