2013-01-08 49 views
13

我有一個視圖內視圖:如何使用自動佈局在其超級視圖的一半中啓動視圖?

+--------------+ 
|    | 
|  +-----+| 
|  |  || 
|  +-----+| 
+--------------+ 

我想內部視圖總是正確的外觀圖的中部水平開始,跨越整個剩餘一半的右邊緣:

innerView.frame.size.width = outerView.frame.size.width/2; 
innerView.frame.origin.x = outerView.frame.size.width/2; 

我該如何表達使用自動佈局?

回答

7

我不認爲你可以在Interface Builder中做到這一點,但通過在代碼中創建約束很容易。

你的第一個等式就是我如何表達約束。第二個方程可能有效,但將原點與寬度聯繫起來很奇怪。他們是不同的數量。相反,只需將innerView的右側固定在outerView的右側。

我們使用屬性NSLayoutAttributeTrailing而不是NSLayoutAttributeRight,所以當本地化RTL時,您的界面將正確翻轉。

// innerView.width = outerView.width * 0.5 
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:innerView 
          attribute:NSLayoutAttributeWidth 
          relatedBy:NSLayoutRelationEqual 
           toItem:outerView 
          attribute:NSLayoutAttributeWidth 
          multiplier:0.5 
           constant:0]; 

// innerView.trailing = outerView.trailing 
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:innerView 
          attribute:NSLayoutAttributeTrailing 
          relatedBy:NSLayoutRelationEqual 
           toItem:outerView 
          attribute:NSLayoutAttributeTrailing 
          multiplier:1.0 
           constant:0]; 

[outerView addConstraints:@[widthConstraint, rightConstraint]]; 
0

您可以放入父視圖的中間並刪除界面構建器中的所有自動佈局設置。如果你將它旋轉,它將始終處於相同的位置事件。

16

實際上,你可以在IB做到這一點/故事板早的Xcode 5.1(可能更早)

  1. 創建視圖和超級視圖
  2. 集之間的寬度約束是對關係「公平」
  3. 設置它的恆定爲「0」
  4. 設置它的乘數爲「2:1」或「1:2」(取決於項目順序在約束)

IB顯然,只允許將乘數設置爲整​​數或比率,而不是浮點數。這裏有一個更清晰

Constraint setting for width half it's parent

注意屏幕帽:如果「第一項」和「第二項」被翻轉,比例爲「2:1」

+0

一個人如何添加這樣的限制? – simme

+0

您是否要求獲取步驟1的更多詳細信息?如果是這樣,一個這樣做的方法是按Ctrl +點擊+拖動之間的子視圖和其超級視圖,並選擇「等寬」。這將創建一個比例爲1:1的寬度約束,然後您需要選擇新創建的約束(無論是從左邊的視圖樹還是來自兩個視圖中的任意一個的大小檢查器),然後更改乘數如上所述 –

+0

該選項被禁用,或者實際上甚至不在我身邊。我只看到前/後空間的東西...:/ – simme

相關問題