iOS自动布局视图以父视图为中心,具有边距和动态高度



我正在创建一个弹出窗口,使用自动布局。我的弹出框有一个动态高度,必须在窗口中居中,有边距。它有一个固定的宽度。

我添加了以下约束:

  • width = fixed value
  • 高度小于或等于计算值
  • 顶距=集装箱顶距+固定值
  • 底边距=集装箱底边距+固定值
  • 中心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));

好的,我找到了一个解决方案:

  • width = fixed value
  • height <= parent height - 2*margin[优先级为1000]
  • height = popup "real" height[优先级为800]
  • 中心x =集装箱中心x
  • 中心y =集装箱中心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));

最新更新