2016-10-19 68 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)); 
相關問題