如何设置AutoLayout约束的常量占父视图的百分比?

时间:2018-10-19 12:46:32

标签: ios swift autolayout constraints

我正在一个需要创建可定制共享卡的项目(了解人们以后可以导出以在社交媒体上共享的图像)。

我将这些共享卡构建为普通的UIView,其中包含其他几个UI元素(大部分为UIImageViews和UILabel)。

为简单起见,我们称之为 SharingCardView

由于此视觉效果将被导出和共享,因此我需要在所有设备上使其外观完全相同。因此,我的理解是,我需要使AutoLayout约束具有基于用户设备屏幕大小的响应常数。

想象一下,我先在iPhone上然后在iPad上显示UIView,我想保持 SharingCardView 内所有内容的纵横比,这样人们就看不到从iPhone或iPad。

###问题:

我希望能够将标签固定在SharingCardView的顶部 **,常量为10%**,如下图所示。

enter image description here

###到目前为止,我已经尝试过这种方式

我试图将常量设置为self.bounds.width * 0.1,但是当我创建视图边界时,该边界显然等于0,因此约束条件只是将所有内容固定在最顶部而没有任何填充。

nowUpOnYTLbl.anchor(top: topAnchor,
                            left: leftAnchor,
                            bottom: nil,
                            right: rightAnchor,
                            paddingTop: self.bounds.width * 0.1,
                            paddingLeft: 30,
                            paddingBottom: 0,
                            paddingRight: 30,
                            width: 0,
                            height: 20
        )

任何建议都会很有帮助。而且,如果您认为该方法完全错误,那么我将竭尽全力寻求替代解决方案。

3 个答案:

答案 0 :(得分:2)

请勿使用框架/边界设置约束!仅使用约束关系来设置约束。因此,在这里,您希望此顶部约束为超级视图的高度约束的1/10。这样,该比率将为 live ,在运行时取决于超级视图的高度实际为多少。

但是,您不能这样做,因为您只能在一个高度限制和另一个高度限制之间形成这种比率。

因此,您将不得不使用不可见的间隔视图,其高度限制为超级视图的高度限制的1/10(即,高度限制相等,multiplier0.1)。 我完全不需要任何代码就可以在Interface Builder中轻松实现这一目标。在我的屏幕快照中,可以看到不可见的间隔视图,因此您可以看到窗帘后面的那个人...!

enter image description here

enter image description here

答案 1 :(得分:0)

您可以通过使标签的顶部约束与共享视图的centerY相关来实现

您将shareView的大小与它的superView设置成比例,因此在不同的设备中运行时,centerY值将有所不同,假设您要使共享视图高度的常数保持为1/10,那么您就可以这样做

  

topConstraintOfLabel =(centerYOfShareView * 2)* 1/10

=

  

topConstraintOfLabel = centerYOfShareView * 1/5

之所以这样做,是因为我们不能用height约束top约束,所以我们使用centerY并将想要的长宽比加倍为centerY = 0.5 * height,同样的事情也适用于centerX的前导/尾随

答案 2 :(得分:0)

您可以使用视图并通过使用乘数从超级视图中为视图提供空间。因此,当您的超级视图大小更改时,视图会根据乘数自动更改其大小。