了解自动布局中的乘数以使用相对定位
我想了解如何利用自动布局来将项目相对于其他视图的百分比定位。
例如,我最近得知,你可以指定一个视图的底部应该比它的超级视图底部高4%,使用这个:
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.96, constant: 0))
这对我来说是有道理的,因为乘数1会在视图的底部alignment,所以通过将乘数改为0.96,可以减less4%。
但是你怎么能在另一个方向做同样的事情呢? 你想指定一个标签的顶部应该从超级视图的顶部开始4%。 如果使用同一行,但将属性更改为.Top
,则意味着它会比superview的顶部高4%(但实际上并不会将其移出屏幕)。 你不能有一个负面的乘数,我不认为,我不相信一个值大于1会做任何事情,当常数是0.那么你怎么得到的设置?
我有同样的问题执行前导和尾随。 拖尾很容易。 如果你想从右边10%
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 0.9, constant: 0))
这是有道理的,因为你拨回0.1或10%,而不是完全alignment在1.0。 但是你如何领导呢? 我以为你可能能够设置标签的领先相对于视图的尾随,然后设置乘数为0.1。 在我看来,这意味着标签将从最右边开始,然后被拨回90%,因此从左边获得所需的10%。 但事实并非如此,我不知道为什么。
你能解释这是如何工作,如何正确使用乘数来获得这些相对布局?
为了简单起见,假设您想要创build一个标签,该标签具有顶部和底部10%的超级视图的高度,尾部和超过视图宽度的10%。 在纵向的iPhone上,标签的上方和下方都会有更多的填充,比左边和右边的填充还要多(像是按比例绘制):
但是,让我们说在iPad上,这将是一个完美的广场视图。 因此填充将是相同的数量,如下所示:
问题是如何定义这种约束是dynamic的,而不是为常量设置一个固定的值。 我已经知道如何做底线和尾随,但顶尖和领导让我难住。 我希望能够理解如何使用乘数来进行更高级的布局,例如,指定一个标签的顶部应该位于另一个标签底部的10%处,而不是将其设置为固定的常数。
有几个方法可以做到这一点。 在最简单的情况下,你已经几乎得到了它:如果你想水平边界为10%和90%,那么你需要指定两个约束相对于超视图的后沿 – 所以Subview.Trailing
locking到Superview.Trailing
的倍数为0.9
,正如你所说的,但是那么Subview.Leading
也locking到Superview.Trailing
,只是乘以0.1
:
(和顶部/底部类似)
另一方面,最后提到的情况要复杂一点:“指定一个标签的顶部应该位于另一个标签的底部10%”。 为此,您可能无法像前一种情况那样使用固定的百分比插入。 相反,您可以在它们之间创build一个不可见的间隔视图:使用Spacer.Height = 0.1 * Superview.Height
添加约束,然后将其添加到两个标签之间。 (您也可以使用这些间隔视图处理以前的情况,但是对于这种情况,这并不是真的有必要。)
在我看来,“你不能有一个负面的乘数,我不认为,并且我不相信一个值大于1,当常数为0时会做任何事情”暴露了你的理解偏差。
引擎盖下面的规则只是一个线性方程:
FirstItem.Attribute1 = (SecondItem.Attribute2 * Multiplier) + Constant
所有的测量点。 如你所见,乘数(NSLayoutConstraint的一个属性)不是常量的乘数。 按照等式,你不明白的事情就会清楚。
至于你的具体例子,@Archaeopterasa提出了一个很好的解决scheme,另一个如下所示:
基于你知道如何做底和尾的事实,我想你已经做了这两件事。 然后再添加两个约束,效果将是你想要的:
最后,如果你想要在另一个标签底部10%的地方指定一个标签的顶部谎言,看来你不能在没有写一行代码的情况下实现它。 在运行时已知superview的高度后,必须使用代码设置连接FirstItem和SecondItem的NSLayoutConstraint对象的常量。
首先,控制从一个标签拖动到另一个标签,select“垂直间距”(或者你可以用其他方法做到这一点)
其次,需要引用sockets:
@IBOutlet weak var tenPercentOfSuperview: NSLayoutConstraint!
然后,在适当的地方做这个(例如,在viewDidLoad())
let heightOfSuperview = self.view.bounds.height tenPercentOfSuperview.constant = heightOfSuperview * 0.1
一切都好了。
如果您想了解更多关于此主题的信息,build议您使用Apple的文档: https : //developer.apple.com/library/ios/recipes/xcode_help-IB_auto_layout/chapters/EditingConstraintAttributesintAttributesInspector.html
这是
非常简单
方法来做到这一点。
只需添加“帮手”或“措施”的意见:
示例中的“计算助手”视图是黄色的。
一般的技术是如此简单明了 – 不需要任何解释,你可以从图像中得到它。
它是iOS中“他们不会教你的东西”中的“大象之一”。 但它在所有的布局中都被不断使用。
(事实上,苹果公司应该为此而制定一个特殊的UIView子类“措施” – 实际上,许多大型团队都这样做,具有明显的特点。)
注意图标#1居中在“视图1/4”辅助视图的右端。
注意图标#3居中在“视图3/4”辅助视图的左端。
你完成了,有一个霞多丽。
方便的是,在助手的意见,只要设置乘数为你想要的任何东西,取决于想要的感觉。 这是非常容易,然后改变你的代码,使用IBInspectable, animation ,等等…
- UICollectionViewCell 4.4和5.5英寸的dynamic大小
- 使用自动布局时,设置UICollectionViewFlowLayout的属性不起作用
- 禁用Xcode Storyboard中的约束
- iOS >>拖动视图跳回原始位置>>自动布局与UIPanGestureRecognizer问题结合
- 在iOS 8中嵌套UICollectionViews,AutoLayout和旋转
- UICollectionView – iOS 10 – iPhone 6 Plus模拟器崩溃,但适用于真实设备
- 出现视图后应用iOS 8 / XCode 6自动布局约束
- Xcodecheckbox在哪里“将自动resize的掩码转换为约束”
- AutoLayout:UIView中的UIView有不正确的框架