Ios NSLayoutConstraint按比例定位

Ios NSLayoutConstraint按比例定位,ios,autolayout,nslayoutconstraint,Ios,Autolayout,Nslayoutconstraint,父视图(绿色矩形)包含许多子视图 只考虑一个子视图,它具有水平位置,x偏移量为0。 每当父视图的宽度改变时,比如说系数a,我需要子视图的偏移量等于a*x 据我所知,NSLayoutConstraint不允许基于包含绿色视图宽度NSLayoutAttributeWidth为红色子视图的属性设置约束 欢迎提出任何建议/参考如何实现通过NSLayoutConstraint所描述的比例定位。您将无法在Interface Builder中进行布局,但可以在code中的超级视图上使用NSLayoutAtt

父视图(绿色矩形)包含许多子视图

只考虑一个子视图,它具有水平位置,x偏移量为0。

每当父视图的宽度改变时,比如说系数
a
,我需要子视图的偏移量等于
a*x

据我所知,
NSLayoutConstraint
不允许基于包含绿色视图宽度
NSLayoutAttributeWidth
为红色子视图的属性设置约束


欢迎提出任何建议/参考如何实现通过
NSLayoutConstraint
所描述的比例定位。

您将无法在Interface Builder中进行布局,但可以在code中的超级视图上使用
NSLayoutAttributeLeft

通过这种方式,您可以为其指定一个倍数,以便在更新superview时保持位置正确

如果这不起作用,可以使用“间隔”视图

所以你会把它们都放在绿色的超级视图中,就像这样

|[spacerView][redView] //using VFL
然后,可以按绿色视图的宽度成比例设置间隔视图的宽度


只需将
间隔视图
设置为隐藏,或将其alpha设置为0.0,这样它就不会显示。

正如您所说,您无法将子视图的left属性与superview的宽度相关联,但可以将其与NSLayoutAttributeLight相关联,后者的值与宽度相同。因此,您应该能够通过使用乘法器(常数为0)来实现


当然,您需要进行计算,根据绿色视图的宽度计算出乘数应该是多少。因此,在我的示例中,绿色视图开始时宽200点,我希望红色视图距离左侧20点,因此我使用0.1作为乘数。

首先感谢您的回答(+1)!但我真正想要的是避免间隔视图,因为目前我在包含视图中有很多子视图,不想有额外的间隔。基本上,我的子视图(红色)是
(originX、originY、width、height)
数据。并且希望使用
autolayout
ing以避免手动重新计算坐标。您能否建议仅对现有子视图进行约束(无空格)?如果在代码中使用
nslayouttributeft
是否无效?否,因为
nslayouttributeft
无法连接到父视图的
nslayouttributewidth
。@deimus啊,当然了。我认为唯一的解决方法是使用间隔视图。除非您可以使用其他完全类似于自定义布局的
UICollectionView
。@deimus p.s.拥抱
IB
,否则您很快就会被甩在后面。随着iOS8和Xcode 6界面构建器的更新,界面构建器将不可避免。您的具体用例是什么?您是希望在旋转时更改间距,还是更一般地在绿色视图中更改任何尺寸?用例是绿色视图中的任何尺寸更改。请不要使用手动编码。只需制作XIB并从Interface Builder进行管理。这也会降低您的代码级别。感谢您的回复!由于绿色和红色(s)视图的复杂结构,我不得不通过手动计算帧来进行布局。在我的例子中,这样代码就更简单了。所以我决定跳过自动布局
[_greenView addConstraint:[NSLayoutConstraint constraintWithItem:_redView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:_greenView attribute:NSLayoutAttributeRight multiplier:.1 constant:0]];