AutoLayout保持视图大小成比例

我试图达到以下目的:

  • 我有2个视图在我的xib需要保持20个像素的边缘(双方和顶部)
  • 需要resize的2个视图的大小不一样
  • 它们必须相隔20个像素
  • 他们的宽度需要保持相对于父视图的宽度

我读了一个关于做这个的教程,它的工作原理,但它的问题是它需要两个视图具有相同的宽度和引脚Widths equally ,我不想要的。

这是我的尝试:

  • 向左视图添加前导空间约束为20像素
  • 将顶部空间约束添加到左视图为20像素
  • 将顶部空间约束添加到右侧视图为20像素
  • 向右视图添加拖尾空间约束为20像素
  • 将两个视图的水平间距约束添加为20个像素

我遇到的问题是,左视图不会resize,正确的视图填充的空间,以保持20像素的水平空间。

有没有一种方法可以使这两个视图按比例调整它们应该填充的空间?

以下是我的布局和约束的截图:

xib布局约束定义

谢谢!

编辑

当我尝试旋转我的设备时,出现以下警告:

 2012-10-11 08:59:00.435 AutolayoutTest[35672:c07] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSLayoutConstraint:0x8a6b2b0 H:[UIView:0x8a6b1d0(170)]>", "<NSLayoutConstraint:0x8a68ad0 H:[UIView:0x8a69430(90)]>", "<NSLayoutConstraint:0x8a6ba40 H:[UIView:0x8a69430]-(20)-[UIView:0x8a6b1d0]>", "<NSLayoutConstraint:0x8a6ba00 H:[UIView:0x8a6b1d0]-(20)-| (Names: '|':UIView:0x8a6b7e0 )>", "<NSLayoutConstraint:0x8a6b940 H:|-(20)-[UIView:0x8a69430] (Names: '|':UIView:0x8a6b7e0 )>", "<NSAutoresizingMaskLayoutConstraint:0x7199aa0 h=--& v=--& V:[UIView:0x8a6b7e0(568)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x8a6b2b0 H:[UIView:0x8a6b1d0(170)]> 

这可以通过添加一个更多的虚拟视图( dummyView ),其约束设置为固定宽度,高度并与Superview的centerXalignment来解决。然后将左视图和右视图水平间距约束添加到dummyView

在这里输入图像说明在这里输入图像说明

我可能很迟才想出一个解决scheme,但实际上在IB中可以非常容易地实现。

首先,添加一个UIView并将其插入到超级视图的所有四个边上。

然后,添加你的第一个子视图 ,并相应地放置它(ig:x = 0,y = 0,height = fixed height,width =相对于我们固定到所有四个边的UIView的宽度)。

selectUIView第一个子视图,并添加一个等宽度约束。 当然,这会显示你在自动布局中的位置错误,但这没关系,因为这还不是你想要的。

现在来诀窍:select等宽度约束和编辑乘数是你想要的比例(例如:1:4,如果你想第一个子视图是UIView的四分之一)。 重复第二个子视图和Tadaaaaaa的步骤!

在这里输入图像说明

我是新来的自动布局,但遇到了你的问题,并认为这将是一个很好的挑战。 (这是我的警告,如果这不是理想的解决scheme!)

您需要在代码中添加宽度约束。 我通过在NIB中首先添加两个视图而没有宽度约束来实现这一点。 这是第一个(左)视图的限制:

在这里输入图像说明

这些是我对第二个(右)视图的限制:

在这里输入图像说明

这会在第二个视图上留下一个额外的限制,即超级视图和第二个视图之间的空格,如下所示:

在这里输入图像说明

你不能删除IB中的约束,因为它会留下不明确的布局(因为我们没有子视图上的宽度)。 但是你可以在代码中删除它。 首先,为它设置一个sockets并将它连接到IB:

 @property (nonatomic, strong) IBOutlet NSLayoutConstraint *view2superviewLeadingConstraint; 

然后,在你的视图控制器的viewDidLoad ,你可以使用:

 [self.view removeConstraint:self.view2superviewLeadingConstraint]; 

最后,添加宽度约束。 这里的关键是multiplier参数,用于根据超级视图的宽度来指定您希望宽度的百分比。 另外请注意,您必须将常量参数设置为等于IB中设置的前导/尾随总数:

 NSLayoutConstraint *constraint1 = [NSLayoutConstraint constraintWithItem:self.view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.3 constant:-20]; [self.view addConstraint:constraint1]; NSLayoutConstraint *constraint2 = [NSLayoutConstraint constraintWithItem:self.view2 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.7 constant:-40]; [self.view addConstraint:constraint2]; 

只要select宽高比:

在这里输入图像说明

正如其他人所提到的,关键是在“Pin Widths Equally”约束上设置一个乘数,以使视图宽度最终成为彼此的倍数。 XCode 5.1应该添加在Interface Builder中设置它的function,但是除此之外,除了在代码中设置它之外,还有另一个选项。 如果您创build“Pin Widths Equally”约束,则转到右侧的“实用程序”面板中的Identity Inspector,然后查找“用户定义的运行属性”。 添加一个新的属性与关键path“乘数”,键入“数字”,并等于您所需的比例值。

乘数设置为运行时属性,如上所述。

这不会反映在Interface Builder中,但是在使用您的视图时将会适用。

  1. 删除代码中的两个宽度约束,或者减less它们在IB中的优先级,否则你是过度约束的。
  2. 添加约束来描述绿色视图和蓝色视图之间的宽度比例,代码如下:

     // Assuming the ratio you want is green_view_width : blue_view_width = 1 : 2 NSLayoutConstraint *c = [NSLayoutConstraint constraintWithItem:greenView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:blueView attribute:NSLayoutAttributeWidth multiplier:0.5f constant:0.f]; [commonSuperview addConstraint:c]; 

XCode 6现在可以使用宽高比属性

我不确定你是否熟悉自动布局,所以,如果这是你已经知道的东西道歉,

使用自动布局时,可以将多个约束分配给相同的属性。 在某些情况下,这些限制可能相互矛盾。 这是什么导致你看到的警告。

从屏幕上看,你抓住了你已经设置了几个约束是明确的 – 例如,左边的绿色视图有一个约束“宽度(90)”,这意味着宽度必须等于90准确地指出。

从屏幕截图中不清楚你的其他约束是如何映射到的,但是这里可能发生的是这些显式的约束导致的问题 – 你有自动调整约束,说视图应该扩大或缩小以适合他们的可用区域,但是那些相同的视图约束条件,要求他们是一个确切的宽度。

这可以通过多种方法解决 – 您可以删除视图上的显式宽度约束,也可以更改它们的优先级(默认约束是“必需的”,但可以将其更改为可选)。

在界面生成器中用右键拖动视图(只显示黑色的popup框)。
在popup菜单中selectAspect Ratio