2016-11-24 142 views
0

我有一個UIScrollView,填補所有的窗口,幷包含一個垂直UIStackView這裏我想補充UILabels填補所有可用的寬度。UIStackView可以被約束嗎?

UIStackView固定在UIScrollView的所有邊緣,我期望它填充所有UIScrollView。但它似乎完全忽略了所有的constriants,它只適合它的孩子。爲什麼會這樣?

要說明,如果我添加標籤那樣:

scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 

    for _ in 1 ... 20 { 
     let textLabel = UILabel() 
     textLabel.backgroundColor = UIColor.yellow 
     textLabel.text = "Hi World xxxx" 
     stackView.addArrangedSubview(textLabel) 
     textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected 

    } 

我所得到的是這樣的:(青色背景是UIScrollView,你可以看到,標籤不採取一切寬歸因於UIStackView約束上不適用)

Result with stackview contraints

且僅當我改變標籤contraint使用滾動視圖它的工作原理是期望:

textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true 

則如預期的結果: enter image description here

爲什麼這種行爲?有人可以解釋爲什麼在UIStackView的約束,因爲我希望不工作?

完整的源代碼avaiable at that gist

+0

lujop嗨,'alignAllCenterX'在你的代碼沒有任何影響。你可以刪除它。 – BangOperator

回答

1

一切都是正確的。它只是你沒有指定內容視圖的寬度(堆棧視圖)。 加入這一行和東西會很好地工作。

scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true; 

注:鋼釘滾動視圖領先的內容視圖後呢,不提供寬度與內容視圖。需要單獨的寬度約束,否則內容視圖的寬度將等於其內在寬度。 鏈接:https://stackoverflow.com/a/18341997/1790683

+0

感謝@BangOperator。你有更多關於爲什麼需要寬度約束的信息?通常固定到邊界足以確定寬度,它不是? – lujop

+0

是scrollviews一個有點不同。你可以谷歌uiscrollview與自動佈局。我會盡快粘貼相關鏈接 – BangOperator