在9.0之前的iOS版本上模仿UIStackView`填充比例'布局方法

Yak*_*sky 13 ios ios-autolayout

iOS 9.0附带UIStackView,可以根据内容大小更轻松地布局视图.例如,要根据内容宽度连续放置3个按钮,您只需将它们嵌入堆栈视图中,设置轴水平和分布 - 按比例填充.

Stack View解决方案

问题是如何在不支持堆栈视图的旧iOS版本中实现相同的结果.

我提出的一个解决方案是粗糙并且看起来不太好.再次,您将3个按钮连续放置并使用约束将它们固定到最近的邻居.在这之后你显然会看到内容优先模糊错误,因为自动布局系统不知道哪个按钮需要在其他按钮之前增长/缩小.

内容优先模糊

不幸的是,在应用程序启动之前标题是未知的,所以你可能会随意选择一个按钮.让我们说,我已经减少了从标准250到249的中间按钮优先级的水平内容.现在它将在其他两个之前增长.另一个问题是,左侧和右侧按钮严格缩小到其内容宽度,而没有像Stack View版本那样漂亮的填充.

布局比较

Xvo*_*lks 5

对于这么简单的事情来说似乎过于复杂.但是约束的乘数值是只读的,所以你必须采取艰难的方式.

如果我不得不这样做,我会这样做:

  1. 在IB中:创建一个带有约束的UIView来水平填充superView(例如)

  2. 在IB中:添加3个按钮,添加约束以水平对齐它们.

  3. 在代码中:以编程方式在每个UIButton和UIView之间创建1个NSConstraint,其属性NSLayoutAttributeWidth和乘数为0.33.

在这里,您将获得3个相同宽度的按钮,使用1/3的UIView宽度.

  1. 观察title按钮(使用KVO或子类UIButton).标题更改后,使用以下内容计算按钮内容的大小:

    CGSize stringsize = [myButton.title sizeWithAttributes: @{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];

  2. 删除所有以编程方式创建的约束

  3. 将每个按钮的计算宽度(步骤4)与UIView的宽度进行比较,并确定每个按钮的比例.

  4. 以相同的方式重新创建步骤3的约束,但用步骤6中计算的比率替换0.33,并将它们添加到UI元素.


Ham*_*mza 4

是的,我们可以通过仅使用约束来获得相同的结果:)

源代码

想象一下,我有三个标签:

  1. 内在内容大小等于 (62.5, 40) 的第一个标签
  2. 固有内容大小等于 (170.5, 40) 的第二个标签
  3. ThirdLabel 的内在内容大小等于 (54, 40)

结构

-- ParentView --
    -- UIView -- (replace here the UIStackView)
       -- Label 1 -- 
       -- Label 2 -- 
       -- Label 3 --            
Run Code Online (Sandbox Code Playgroud)

约束条件

例如 UIView 有这样的约束:view.leading = superview.leading,view.trailing = superview.trailing,并且它垂直居中

在此输入图像描述

UILabels 约束

在此输入图像描述

SecondLabel.width 等于:

firstLabel.width * (secondLabelIntrinsicSizeWidth / firstLabelIntrinsicSizeWidth)

ThirdLabel.width 等于:

firstLabel.width * (thirdLabelIntrinsicSizeWidth /firstLabelIntrinsicSizeWidth)

我会回来寻求更多解释

在此输入图像描述