Yak*_*sky 13 ios ios-autolayout
iOS 9.0附带UIStackView,可以根据内容大小更轻松地布局视图.例如,要根据内容宽度连续放置3个按钮,您只需将它们嵌入堆栈视图中,设置轴水平和分布 - 按比例填充.
问题是如何在不支持堆栈视图的旧iOS版本中实现相同的结果.
我提出的一个解决方案是粗糙并且看起来不太好.再次,您将3个按钮连续放置并使用约束将它们固定到最近的邻居.在这之后你显然会看到内容优先模糊错误,因为自动布局系统不知道哪个按钮需要在其他按钮之前增长/缩小.
不幸的是,在应用程序启动之前标题是未知的,所以你可能会随意选择一个按钮.让我们说,我已经减少了从标准250到249的中间按钮优先级的水平内容.现在它将在其他两个之前增长.另一个问题是,左侧和右侧按钮严格缩小到其内容宽度,而没有像Stack View版本那样漂亮的填充.
对于这么简单的事情来说似乎过于复杂.但是约束的乘数值是只读的,所以你必须采取艰难的方式.
如果我不得不这样做,我会这样做:
在IB中:创建一个带有约束的UIView来水平填充superView(例如)
在IB中:添加3个按钮,添加约束以水平对齐它们.
在代码中:以编程方式在每个UIButton和UIView之间创建1个NSConstraint,其属性NSLayoutAttributeWidth和乘数为0.33.
在这里,您将获得3个相同宽度的按钮,使用1/3的UIView宽度.
观察title按钮(使用KVO或子类UIButton).标题更改后,使用以下内容计算按钮内容的大小:
CGSize stringsize = [myButton.title sizeWithAttributes:
@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
删除所有以编程方式创建的约束
将每个按钮的计算宽度(步骤4)与UIView的宽度进行比较,并确定每个按钮的比例.
以相同的方式重新创建步骤3的约束,但用步骤6中计算的比率替换0.33,并将它们添加到UI元素.
是的,我们可以通过仅使用约束来获得相同的结果:)
想象一下,我有三个标签:
结构
-- 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)
我会回来寻求更多解释
| 归档时间: |
|
| 查看次数: |
3538 次 |
| 最近记录: |