如果我設置:iOS的11 UIStackView填補比例分配導致怪異的觀點加載動畫
stackView.distributon = .fillProportionally
然後在iOS上11裝載包含此堆棧視圖(所有子視圖的視圖時,我得到一個非常怪異的動畫 - 不僅僅堆棧視圖 - 從屏幕的頂部或底部飛行)。在較低的iOS版本上,一切正常。如果我將堆棧視圖的分發設置爲其他任何內容,那麼一切正常。
有沒有人有任何想法可能是這個問題的原因?
謝謝。
如果我設置:iOS的11 UIStackView填補比例分配導致怪異的觀點加載動畫
stackView.distributon = .fillProportionally
然後在iOS上11裝載包含此堆棧視圖(所有子視圖的視圖時,我得到一個非常怪異的動畫 - 不僅僅堆棧視圖 - 從屏幕的頂部或底部飛行)。在較低的iOS版本上,一切正常。如果我將堆棧視圖的分發設置爲其他任何內容,那麼一切正常。
有沒有人有任何想法可能是這個問題的原因?
謝謝。
我想我找到了一個修復程序 - 在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.
如果我不具有在animations
塊self.view.layoutIfNeeded()
,那麼,當正在顯示圖B,它在從屏幕的頂部蒼蠅。 (當視圖B被隱藏時,它隱藏正常 - 從屏幕底部向下移動。)
當我將self.view.layoutIfNeeded()
添加到animations
塊中時,視圖B顯示如預期 - 它從屏幕底部。
感謝來自@ g3rv4的回覆,指引我朝這個方向發展!
今天早上我用轉基因種子遇到了同樣的問題。我已經結束了使用UIView.performWithoutAnimation {
塊來做任何UIStackView
修改動畫暫時不需要。
對我來說,問題是iOS 11中引入的行爲迴歸,與UIStackView分佈類型無關。我嘗試了幾個基於代碼的解決方案無濟於事:首先,在容器層次結構上調用layoutIfNeeded;其次,(如另一個類似問題的答案所示)調整觀點的contentMode。
我的哈克溶液如下:
添加新的,零寬度的UIView佔位符上UIStackView的一側展示動畫被錯誤地把在從屏幕的邊緣的項目。
您是否曾經爲此找到過解決方案?我遇到了類似的問題,即從屏幕頂部飛過的視圖 - 雖然我的堆棧視圖設置爲「Fill」分佈(默認)。使用Xcode 9 GM種子和iOS 11 GM種子。 –
在設置'stackView.distributon = .fillProportionally'之前調用'self.view.layoutIfNeeded()'。 – kiwisip
@MattCline我有同樣的問題...... :(。任何想法如何解決它? – kmithi