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() }
)
}
}
このコントローラは、設定2つの垂直のビュー、緑1(A)とオレンジ1(B)はUIStackView
:
は、ここに私の再現です。私はないはanimations
ブロック内self.view.layoutIfNeeded()
を持っている場合、ボタンの皮をタップ/隠蔽を解除するにはB.
を表示するビューBが表示されている場合、その後、それは画面の上部から飛びます。 (ビューBが非表示になっていると、画面の下から下に移動して普通に非表示になります)
animations
ブロックにself.view.layoutIfNeeded()
を追加すると、ビューBが期待通りに表示されます。 。
@ g3rv4からのこのおかげで、私に指摘してくれたおかげで!
解決方法を見つけましたか?私はスタックビューが 'Fill'ディストリビューション(デフォルト)に設定されていますが、画面の上部から飛んでいるビューにも同様の問題があります。 Xcode 9 GMシードとiOS 11 GMシードの使用 –
'stackView.distributon = .fillProportionally'を設定する直前に' self.view.layoutIfNeeded() 'を呼び出しました。 – kiwisip
@MattCline私は同じ問題を抱えています... :(。どのようなアイデアを修正するには? – kmithi