【问题标题】:iOS autolayout view centered in parent, with margins and dynamic heightiOS 自动布局视图以父级为中心,具有边距和动态高度
【发布时间】:2017-03-01 01:02:16
【问题描述】:

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

我添加了以下约束:

  • 宽度 = 固定值
  • 高度小于或等于计算值
  • 上边距 = 容器上边距 + 固定值
  • 底边距 = 容器底边距 + 固定值
  • 中心 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));

【问题讨论】:

  • 只使用中心y和高度约束小于或等于,删除底部和顶部边距
  • 我不能这样做:我需要顶部和底部约束,以便在用户旋转设备时弹出窗口可以正确调整其大小(我想避免必须手动处理它)。
  • 为此您可以使用另一个高度约束并安装/卸载它,或者更新现有高度约束的常量。
  • 移除垂直居中约束。因为您已经指定了顶部和底部约束。也尝试将translatesAutoresizingMaskIntoConstraints设置为NO
  • 在我的弹出窗口没有填满窗口的情况下不起作用。我找到了解决方案,请参阅我的答案。还是谢谢!

标签: ios dynamic autolayout margin center


【解决方案1】:

好的,我找到了解决办法:

  • 宽度 = 固定值
  • height
  • 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2013-07-04
    • 2015-09-17
    • 2013-05-25
    • 2016-12-08
    相关资源
    最近更新 更多