簡體   English   中英

UIScrollView 中的 UIStackView 不滾動

[英]UIStackView in UIScrollView not scrolling

我在UIScrollView實現UIStackView時遇到了一些麻煩。 我的視圖層次結構如下所示:

 ┌─────────────────────────────┐
 │ViewController               │
 │┌───────────────────────────┐│
 ││Spacer UIView              ││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││ UIScrollView              ││
 ││┌─────────────────────────┐││
 │││UIStackView              │││
 │││                         │││
 │││                         │││
 ││└─────────────────────────┘││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││Spacer UIView              ││
 │└───────────────────────────┘│
 │┌───────────────────────────┐│
 ││UIView with other content  ││
 ││height: 300                ││
 │└───────────────────────────┘│
 └─────────────────────────────┘

我有間隔視圖,以便內容垂直居中,如果它短於屏幕的整個高度。 我將NSLayoutConstraints布局如下V:|-[spacer1]-[scrollview]-[spacer2(==spacer1)]-[footerView]-|

該UIStackView GET充滿了UIViews每50的高度(基本上與行的表)。

到現在為止還挺好。 一旦我的堆棧視圖的行數超過“房間”,我就會收到一連串無休止的錯誤消息,指出必須打破約束(單行的高度)。 錯誤消息會隨着不斷新的對象內存 id 不斷來回傳遞 - 它基本上永遠不會完成。 我假設我的滾動視圖的內容高度沒有正確設置。

在我的viewDidLoad我設置了墊片和滾動視圖:

let spacer1 = UIView()
spacer1.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(spacerView1)
spacerView1.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true

let scroll = UIScrollView()
scroll.translatesAutoresizingMaskIntoConstraints = false
scroll.showsHorizontalScrollIndicator = false
self.view.addSubview(scroll)
scroll.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true

let stack = UIStackView()
stack.axis = .vertical
stack.translatesAutoresizingMaskIntoConstraints = false
stack.alignment = .center
stack.spacing = 2
stack.distribution = .equalSpacing
scroll.addSubview(stack)
stack.topAnchor.constraint(equalTo: scroll.topAnchor).isActive = true
stack.leftAnchor.constraint(equalTo: scroll.leftAnchor).isActive = true
stack.rightAnchor.constraint(equalTo: scroll.rightAnchor).isActive = true
stack.bottomAnchor.constraint(equalTo: scroll.bottomAnchor).isActive = true
stack.widthAnchor.constraint(equalTo: scroll.widthAnchor).isActive = true
stack.heightAnchor.constraint(equalTo: scroll.heightAnchor).isActive = true

在從另一個類調用另一方法中,我然后添加UIViewsUIStackView :簡單地將其添加像stack.addArrangedSubview(rowView)

將 UIView 添加到堆棧視圖后,我調整滾動視圖的大小

extension UIScrollView {
    func resizeScrollViewContentSize() {
        var contentRect = CGRect.zero
        for view in self.subviews {
            contentRect = contentRect.union(view.frame)
        }
        self.contentSize = contentRect.size
    }
}

這給出了約束破壞錯誤。

如果我刪除堆棧視圖的高度約束,那么它會折疊並且調試視圖層次結構告訴我 UIStackView 的高度和垂直位置不明確。 一旦所有行都添加到堆棧視圖中,我還嘗試簡單地設置scroll.contentSize = stack.frame.size 但這也不起作用。 我還嘗試先將行添加到堆棧視圖,然后將堆棧視圖添加到滾動視圖。 這樣堆棧視圖應該知道它的大小要求,但這也不起作用。

如前所述,只要行的總高度小於可能的空間,就可以正常工作。 一旦我再添加一行或在屏幕尺寸較小的設備上執行應用程序,我Will attempt to recover by breaking constraint <NSLayoutConstraint:0x600000b29fe0 MyApp.RowView:0x7fc571e840f0.height == 50 (active)>

基本上UIScrollView的滾動功能不適用於我的堆棧視圖。 如何強制滾動視圖重新計算其內容所需的高度。

我錯過了什么或做錯了什么?

謝謝

為了解決這個問題,stackView 高度必須是動態的。 嘗試將高度約束優先級設置為 750,子視圖布局后,一切正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM