2017-08-25 41 views
5

如果我設置:iOS的11 UIStackView填補比例分配導致怪異的觀點加載動畫

stackView.distributon = .fillProportionally 

然後在iOS上11裝載包含此堆棧視圖(所有子視圖的視圖時,我得到一個非常怪異的動畫 - 不僅僅堆棧視圖 - 從屏幕的頂部或底部飛行)。在較低的iOS版本上,一切正常。如果我將堆棧視圖的分發設置爲其他任何內容,那麼一切正常。

有沒有人有任何想法可能是這個問題的原因?

謝謝。

+1

您是否曾經爲此找到過解決方案?我遇到了類似的問題,即從屏幕頂部飛過的視圖 - 雖然我的堆棧視圖設置爲「Fill」分佈(默認)。使用Xcode 9 GM種子和iOS 11 GM種子。 –

+1

在設置'stackView.distributon = .fillProportionally'之前調用'self.view.layoutIfNeeded()'。 – kiwisip

+0

@MattCline我有同樣的問題...... :(。任何想法如何解決它? – kmithi

回答

8

我想我找到了一個修復程序 - 在animations區塊中調用self.view.layoutIfNeeded()

這裏是我的再現:

import UIKit 

class ViewController: UIViewController { 

    var showB = true 

    weak var viewB: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let viewA = UIView() 
     viewA.backgroundColor = UIColor.green 

     let toggleViewBButtonAnimated = UIButton(frame: CGRect(x: 50, y: 150, width: 200, height: 40)) 
     toggleViewBButtonAnimated.backgroundColor = UIColor.cyan 
     toggleViewBButtonAnimated.setTitle("Toggle B (animated)", for: .normal) 
     viewA.addSubview(toggleViewBButtonAnimated) 
     toggleViewBButtonAnimated.addTarget(self, action: #selector(toggleBButtonTappedAnimated), for: .touchUpInside) 


     let viewB = UIView() 
     viewB.backgroundColor = UIColor.orange 
     let viewBHeightConstraint = viewB.heightAnchor.constraint(equalToConstant: 200) 
     viewBHeightConstraint.priority = 999 
     viewBHeightConstraint.isActive = true 
     self.viewB = viewB 


     let stackView = UIStackView(arrangedSubviews: [viewA, viewB]) 
     stackView.axis = .vertical 
     stackView.alignment = .fill 
     stackView.distribution = .fill 
     stackView.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(stackView) 

     stackView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
     stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
     stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
     stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true 
    } 

    @IBAction func toggleBButtonTappedAnimated() { 
     self.showB = !self.showB 
     UIView.animate(withDuration: 0.3, 
         animations: { self.viewB.isHidden = !self.showB; self.view.layoutIfNeeded() } 
     ) 
    } 
} 

該控制器設置有兩個垂直的看法,一個綠色的(A)和橙一個(B)一UIStackView。輕敲按鈕隱藏/取消隱藏查看B.

如果我具有在animationsself.view.layoutIfNeeded(),那麼,當正在顯示圖B,它在從屏幕的頂部蒼蠅。 (當視圖B被隱藏時,它隱藏正常 - 從屏幕底部向下移動。)

當我將self.view.layoutIfNeeded()添加到animations塊中時,視圖B顯示如預期 - 它從屏幕底部。

感謝來自@ g3rv4的回覆,指引我朝這個方向發展!

+0

太棒了!在設置'stackView.distributon = .fillProportionally'之前調用'self.view.layoutIfNeeded()'!謝謝。 – kiwisip

+0

您不應該在動畫塊中更改'UIStackView'的'subview'的隱藏屬性,因爲iOS <= 10中存在一個錯誤,在iOS 11中某些情況下動畫看起來很奇怪。 –

+0

將self.view.layoutIfNeeded()添加到動畫塊的末尾爲我修復了它。 stackview以前是從屏幕頂部進行動畫的,但不是從正確的點開始動畫。謝謝! – vikzilla

1

今天早上我用轉基因種子遇到了同樣的問題。我已經結束了使用UIView.performWithoutAnimation {塊來做任何UIStackView修改動畫暫時不需要。

0

對我來說,問題是iOS 11中引入的行爲迴歸,與UIStackView分佈類型無關。我嘗試了幾個基於代碼的解決方案無濟於事:首先,在容器層次結構上調用layoutIfNeeded;其次,(如另一個類似問題的答案所示)調整觀點的contentMode。

我的哈克溶液如下:

添加新的,零寬度的UIView佔位符上UIStackView的一側展示動畫被錯誤地把在從屏幕的邊緣的項目。