2013-02-18 72 views
113

最近進入了自動佈局,我被困在看起來像一個非常微不足道的問題的例子。我有一種觀點,我想坐在屏幕的頂部,佔據屏幕高度的一半。在自動佈局之前簡單 - 只需將其固定就位,並在超級視圖調整大小時告訴它垂直擴展。自動佈局 - 使視角的高度相對於超級景觀高度的一半

現在,我不能爲我的生活看到如何去做。下面是我得到的,當我嘗試此設置:

autolayout blues

底部空間限制設置爲「等於284」,當我改變對iPhone4的佈局,是絕對的,絕對對我沒用,因爲它在屏幕底部保留284個點的空間,並將視圖縮小到不再是屏幕大小的一半。而且也沒有設置該約束等於任何其他視圖的高度的某一部分的方式..

掙扎了一會兒後,我能想到這樣做的唯一方法是要介紹的這款視圖下方另一種觀點認爲,它們的管腳高度相等,讓他們坐在上面和下面,然後設置第二個(底部)視圖是隱形的......這看起來有點難看!

我失去了一些東西明顯?..

+1

我不認爲這是醜陋的,但一個聰明的把戲,讓你想使用什麼IB。我已經這樣做了,當你使用正確的元素名稱時,你可以清楚發生了什麼。你甚至可以在不同的位置或中心有第三個元素,根據這兩個子視圖改變大小。 – Jelle 2013-12-19 12:36:38

回答

141

從[至少] Xcode 5.1.1開始,這在IB中是可行的。雖然我花了一段時間才發現它實際上超級簡單:

首先創建一個基本的頂部對齊約束(您還需要設置底部,左側和右側約束,如同正常) 。然後選擇約束,然後導航到屬性檢查:

Demonstration of steps above

然後你就可以調整乘數。如果你想讓超級視圖的50%保留在1,因爲它是按照超級中心對齊的。這也是創建視圖是其他百分比過一個偉大的方式(如超圖的25%)

Demonstration of second step above

+0

不錯:)我認爲這篇文章應該被標記爲接受答案:) iOS開發人員經常喜歡Interface Builder解決方案而不是類似代碼的解決方案 – hqt 2014-09-13 19:14:05

+0

@hqt,謝謝。我認爲,當接受的答案寫成這種方法是不可用的。有時候提問者不會重新提出舊問題或者關心改變被接受的答案。但最終我只是在這裏幫忙,很高興它! – Firo 2014-09-13 19:46:42

+2

我有點困惑。我嘗試過,但它只是將視圖集中到超級視圖中,而不是調整視圖的高度。 – Dean 2014-10-31 14:57:59

30

後多一點的時間,我想出了以下內容。

我注意到它作爲一個答案,但它不是非常令人滿意,因爲它假設在Interface Builder你不能真正做到這一點,但可以在代碼中加入正確的約束之後爲:

- (void) viewWillAppear:(BOOL)animated 
{ 

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:0 
                    toItem:self.view 
                   attribute:NSLayoutAttributeHeight 
                   multiplier:.5 
                    constant:0]; 
    [self.view addConstraint:constraint]; 

} 

基本上,它對self.view的高度設置0.5的乘數,作用於upperview。 我不得不在IB中將底部垂直空間約束的優先級設置爲低於1000,以避免關於中斷約束的一堆運行時消息。因此,如果任何人都可以展示如何在界面生成器中做到這一點,那會更好地回答我的問題,否則我認爲這是一樣好(現在)?

+3

我認爲這是現在的狀況。如果Apple允許我們訪問IB中的乘數值,那將是很好的,因此可以將其設置爲常數。 – rdelmar 2013-02-18 16:48:41

+3

對於任何正在查看此答案的人,Xcode 5.1現在允許您通過Interface Builder設置乘數。我現在可以通過IB配置其超級視圖高度的一半。 – 2014-04-05 14:18:05

7

我還有另外一種可能性,如果你有兩個視圖應該具有相同的高度:只需將view2的高度設置爲view1的高度(這裏的技巧不是明確設置view1的高度)。

[self.view addConstraints:[NSLayoutConstraint 
     constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]" 
          options:0 
          metrics:nil 
           views:viewsDict]]; 
+0

沒有意識到你可以參考寬度/高度這樣的其他意見。如果您已經使用了視覺格式語言,這是最乾淨的答案。 – loeschg 2014-09-05 14:47:18

+0

@brainray示例也在[developer.apple.com here](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample)中進行了解釋。html#// apple_ref/doc/uid/TP40010853-CH5-SW7) – 2015-03-12 23:09:20

147

故事板解決方案,你可以設置任何意見之間的精確率:

Set height equality constraint

現在:

Edit constraint's multiplier

利潤!

Result

附:此外請注意,此方法適用於不同嵌套級別的視圖,並且(顯然)適用於寬度

P.P.S.有時可能有助於「約束第一和第二項」或設置反向乘數(例如2而不是0.5)(但如果您不理解視圖之間的相互關係如何,這些方法是無用的)。

+0

第2步似乎不適合我。除了切換「約束到邊距」外,我無法在面板中選擇任何內容。我試圖將UITableViewCell中的UIImageView的寬度設置爲內容視圖的50%。 – DrMickeyLauer 2014-12-29 17:15:39

+1

更新:很明顯,界面生成器不允許內容視圖成爲任何自動佈局約束的顯式目標。我必須插入一個虛擬子視圖作爲內容視圖的子項才能完成此項工作。 – DrMickeyLauer 2014-12-29 19:54:06

+1

它適合我。您需要選擇列表中的兩個視圖,而不是構建器屏幕。對於百分比,將較小視圖與較大視圖分開,以獲得乘數值示例較小視圖25,較大視圖135-25/135 = 0.185。設置這個乘數值來得到x1和x2 = 25的視圖,但是用更大的6和6加上等等。 – latenitecoder 2015-01-29 22:22:56

4

比方法比Fyodor Volchyok的答案稍簡單,也比方法更直接。 - 按住控制按鈕並點擊子視圖。 - 只需按住命令按鈕,將光標拖到超級視圖,然後單擊超級視圖。 - 選擇「長寬比」。

enter image description here

- 然後單擊大小檢查。 - 然後雙擊約束。 enter image description here

- 確保爲這兩個項目選擇了「高度」。 enter image description here

- 然後將「乘數」更改爲0.5半屏或任何你想要的超視圖分數。 enter image description here

+0

簡單快捷的方法!謝了哥們 – 2017-05-10 01:51:27

0

丈量的回答斯威夫特版本:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 



    upperView.translatesAutoresizingMaskIntoConstraints = false 


    var constraint = NSLayoutConstraint(item: upperView, 
             attribute: NSLayoutAttribute.top, 
             relatedBy: NSLayoutRelation.equal, 
             toItem: self.view, 
             attribute: NSLayoutAttribute.top, 
             multiplier: 1, 
             constant: 0) 

    self.view.addConstraint(constraint) 


    constraint = NSLayoutConstraint(item: upperView, 
            attribute: NSLayoutAttribute.height, 
            relatedBy: NSLayoutRelation.equal, 
            toItem: self.view, 
            attribute: NSLayoutAttribute.height, 
            multiplier: 0.5, 
            constant: 0) 

    self.view.addConstraint(constraint) 


    constraint = NSLayoutConstraint(item: upperView, 
            attribute: NSLayoutAttribute.leading, 
            relatedBy: NSLayoutRelation.equal, 
            toItem: self.view, 
            attribute: NSLayoutAttribute.leading, 
            multiplier: 1, 
            constant: 0) 

    self.view.addConstraint(constraint) 


    constraint = NSLayoutConstraint(item: upperView, 
            attribute: NSLayoutAttribute.trailing, 
            relatedBy: NSLayoutRelation.equal, 
            toItem: self.view, 
            attribute: NSLayoutAttribute.trailing, 
            multiplier: 1, 
            constant: 0) 

    self.view.addConstraint(constraint) 


} 
相關問題