2013-07-04 27 views
13

我希望能夠將我的子視圖放置在頂層超大視圖大小的25%處。如何定位相對於包含視圖大小的子視圖?

NSLayoutConstraint *topPositionConstraint = [NSLayoutConstraint constraintWithItem:_containerView 
                      attribute:NSLayoutAttributeTop 
                      relatedBy:NSLayoutRelationEqual 
                      toItem:_childView 
                      attribute:NSLayoutAttributeHeight 
                     multiplier:0.25f 
                      constant:0.0f]; 

不過,現在我得到以下異常:

'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Invalid pairing of layout attributes' 

爲什麼會發生錯誤,我怎麼能實現我想要什麼?

回答

6

您不能在相同約束中使用頂部和高度。儘管說系統不喜歡它是有道理的。

你可以做的反而是像...

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
            attribute:NSLayoutAttributeTop 
            relatedBy:NSLayoutRelationEqual 
            toItem:_containerView 
            attribute:NSLayoutAttributeTop 
           multiplier:1.0 
            constant:_containerView.frame.size.height * 0.25]; 
+0

在我交換子視圖和容器視圖後,這很有效。 – circuitlego

+0

對不起,對,你說得對。你在childView上設置約束,所以它應該是第一個。 – Fogmeister

+1

請注意,「_containerView.frame.size.height」在橫向和縱向模式下會有所不同。因此,如果從橫向模式開始,計算出的值將不會與從縱向模式開始的相同。 – Vanja

22

而不是使用框架作爲公認的答案,你可以,如果你使用底部,而不是高度的移動百分比乘數。我正在使用這種技術來進行基於百分比的子視圖定位。這也很好,因爲創建約束時可能沒有設置容器視圖的框架:

NSLayoutConstraint *topPositionConstraint = 
    [NSLayoutConstraint constraintWithItem:_childView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
           toItem:_containerView 
           attribute:NSLayoutAttributeBottom 
          multiplier:0.25 
           constant:0]; 
+0

容器視圖沒有框架原點在0,0時,這是正確的嗎? –

+3

這是完美的。他們不允許NSLayoutAttributeTop和NSLayoutAttributeHeight彼此兼容(它們只是數字!!),並且甚至沒有在文檔中提到它(除非我錯過了某些內容)。感謝您的解決方案。 –

+0

真棒,這應該是接受的答案,沒有框架tweking – Max

相關問題