作者:娇Rex_630 | 来源:互联网 | 2023-01-21 14:01
如果我设置:
stackView.distributon = .fillProportionally
然后在iOS 11上,当加载包含此堆栈视图的视图时,我得到一个非常奇怪的动画(所有子视图 - 不仅仅是堆栈视图 - 从屏幕的顶部或底部飞行).在较低的iOS版本上一切正常.如果我将堆栈视图的分布设置为其他任何东西,那么一切也正常.
有谁知道这个问题的原因是什么?
谢谢.
1> 小智..:
我想我已经找到了一个修复 - self.view.layoutIfNeeded()
在animations
块中调用.
这是我的复制品:
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() }
)
}
}
该控制器设置UIStackView
有两个垂直视图,绿色(A)和橙色(B).点击按钮隐藏/取消隐藏视图B.
如果我不具有self.view.layoutIfNeeded()
在animations
块,那么,当正在显示图B,它在从屏幕的顶部苍蝇.(当视图B被隐藏时,它会正常隐藏 - 从屏幕底部向下移动.)
当我添加self.view.layoutIfNeeded()
到animations
块时,视图B按预期显示 - 它从屏幕底部出现.
感谢来自@ g3rv4的回答,指出我朝着这个方向前进!