2016-10-19 49 views
0

我创建一个弹出窗口,使用自动布局。我的弹出窗口具有动态高度,并且必须以窗口为中心,并带有边距。它有一个固定的宽度。iOS自动布局视图居中父母,边距和动态高度

添加以下约束:

  • 宽度=固定值
  • 高度小于或等于计算值
  • 上边距=容器上边距+固定值
  • 底部边缘=集装箱底部边距+固定值
  • 中心x =集装箱中心x
  • 中心y =集装箱中心y

看来工作,但Xcode中显示一个警告:

无法同时满足的约束。

以下列表中的至少一个约束可能是您不想要的约束之一。试试这个:(1)看看每个约束,并试图找出你不期望的; (2)找到添加不需要的约束或约束并修复它的代码。 (注意:如果你看到,你不明白NSAutoresizingMaskLayoutConstraints,请参阅文档UIView的财产translatesAutoresizingMaskIntoConstraints)

"<NSLayoutConstraint:0x7e572a40 V:|-(>=19)-[UIView:0x7a8bb6a0] (Names: '|':UIView:0x7e572140)>", 
"<NSLayoutConstraint:0x7e573620 UIView:0x7a8bb6a0.bottom >= UIView:0x7e572140.bottom + 19>", 
"<NSLayoutConstraint:0x7e573950 UIView:0x7a8bb6a0.centerY == UIView:0x7e572140.centerY>" 

将尝试打破约束恢复

<NSLayoutConstraint:0x7e573620 UIView:0x7a8bb6a0.bottom >= UIView:0x7e572140.bottom + 19> 

有什么不对?如果我删除了Xcode中断的约束,它就不再起作用(我的弹出窗口不再可见)。

这是我的约束的代码:

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.width, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:nil, 
              attribute:NSLayoutAttribute.notAnAttribute, 
              multiplier: 1, 
              constant: UIPopup.defaultSize.width)); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.height, 
              relatedBy:NSLayoutRelation.lessThanOrEqual, 
              toItem:nil, 
              attribute:NSLayoutAttribute.notAnAttribute, 
              multiplier: 1, 
              constant:popupHeight)); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.top, 
              relatedBy:NSLayoutRelation.greaterThanOrEqual, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.top, 
              multiplier: 1, 
              constant:verticalMargin)); 


self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.bottom, 
              relatedBy:NSLayoutRelation.greaterThanOrEqual, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.bottom, 
              multiplier: 1, 
              constant:verticalMargin)); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.centerX, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.centerX, 
              multiplier: 1, 
              constant: 0)); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.centerY, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.centerY, 
              multiplier: 1, 
              constant: 0)); 
+0

只是使用中心y和高度约束用小于或等于,取下底部和顶部边缘 –

+0

我不能这样做:我需要顶部和底部约束,以便弹出窗口在用户旋转设备时正确调整其大小(并且我想避免必须手动处理)。 –

+0

,因为您可以使用另一个高度约束并安装/卸载它,或者更新现有高度约束的常量。 –

回答

0

行,我发现一种解决方案:

  • 宽度=固定值
  • 高度< =父高度 - 2 *余量与1000优先]
  • 高度=弹出“真实”高度[800优先]
  • 中心x =集装箱中心叔X
  • 中心Y =容器中心ý

代码:

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.width, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:nil, 
              attribute:NSLayoutAttribute.notAnAttribute, 
              multiplier: 1, 
              constant: UIPopup.defaultSize.width)); 

let maxHeightConstraint = NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.height, 
              relatedBy:NSLayoutRelation.lessThanOrEqual, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.height, 
              multiplier: 1, 
              constant:-2*verticalMargin); 
maxHeightConstraint.priority = 1000; 
self.view.addConstraint(maxHeightConstraint); 

let heightConstraint = NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.height, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:nil, 
              attribute:NSLayoutAttribute.notAnAttribute, 
              multiplier: 1, 
              constant:popupHeight); 
heightConstraint.priority = 800; 
self.view.addConstraint(heightConstraint); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.centerX, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.centerX, 
              multiplier: 1, 
              constant: 0)); 

self.view.addConstraint(NSLayoutConstraint(item:_mainContainer, 
              attribute:NSLayoutAttribute.centerY, 
              relatedBy:NSLayoutRelation.equal, 
              toItem:self.view, 
              attribute:NSLayoutAttribute.centerY, 
              multiplier: 1, 
              constant: 0)); 
相关问题