如何让stackview在向下滚动时消失,向上滚动时重新出现?
How to make stackview disappear when scrolling down and re-appear when scrolling up?
我创建了一个堆栈视图,其中包含 2 个名为
的按钮
Services and Customize
我的目标是让这个堆栈视图在我向下滚动时消失,并在我向上滚动时再次出现。当我向下滚动时一切正常,但当我向上滚动时,堆栈视图,我将其命名为
menuStack
它与表格视图重叠。正如您在屏幕截图中看到的,tableView 是包含鞋子图像的那个。
我为滚动视图尝试了这个委托,但我认为我的锚中缺少某些东西。以下是每个事件的 3 个屏幕截图。
This is the default view
When I scroll down
When I scroll up the menuStack does not reappear
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
self.menuStack.translatesAutoresizingMaskIntoConstraints = false
if targetContentOffset.pointee.y < scrollView.contentOffset.y {
//scroll up
self.menuStack.isHidden = true
if #available(iOS 11.0, *) {
let safeGuide = self.view.safeAreaLayoutGuide
self.menuStack.topAnchor.constraint(equalTo: safeGuide.topAnchor).isActive = true
self.menuStack.bottomAnchor.constraint(equalTo: self.tableView.topAnchor, constant: 50).isActive = true
self.tableView.topAnchor.constraint(equalTo: safeGuide.topAnchor, constant: 100).isActive = true
} else {
// Fallback on earlier versions
}
self.menuStack.isHidden = false
} else {
//scroll down
self.menuStack.isHidden = true
if #available(iOS 11.0, *) {
let safeGuide = self.view.safeAreaLayoutGuide
self.tableView.topAnchor.constraint(equalTo: safeGuide.topAnchor).isActive = true
} else {
// Fallback on earlier versions
}
}
}
当用户将手指从 tableView 上移开时,似乎调用了 scrollViewDidEndDragging 函数,这发生在 tableView 开始其减速动画之前。我认为你应该改用 scrollViewDidScroll 。我试过了,它对我有用:
class ViewController: UIViewController {
@IBOutlet weak var menuStackView: UIStackView!
@IBOutlet weak var tableViewTopConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.dataSource = self
tableView.delegate = self
}
}
}
extension ViewController: UITableViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
menuStackView.isHidden = scrollView.contentOffset.y > CGPoint.zero.y
tableViewTopConstraint.constant = (scrollView.contentOffset.y > CGPoint.zero.y) ? 0 : 40
//CGPoint.zero.y is when the contentOffset is at the top
}
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = "\(indexPath.row)"
return cell
}
}
我也会 post 截图 UI 这样你就可以看到我的设计是如何设置的。
我创建了一个堆栈视图,其中包含 2 个名为
的按钮Services and Customize
我的目标是让这个堆栈视图在我向下滚动时消失,并在我向上滚动时再次出现。当我向下滚动时一切正常,但当我向上滚动时,堆栈视图,我将其命名为
menuStack
它与表格视图重叠。正如您在屏幕截图中看到的,tableView 是包含鞋子图像的那个。
我为滚动视图尝试了这个委托,但我认为我的锚中缺少某些东西。以下是每个事件的 3 个屏幕截图。
This is the default view
When I scroll down
When I scroll up the menuStack does not reappear
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
self.menuStack.translatesAutoresizingMaskIntoConstraints = false
if targetContentOffset.pointee.y < scrollView.contentOffset.y {
//scroll up
self.menuStack.isHidden = true
if #available(iOS 11.0, *) {
let safeGuide = self.view.safeAreaLayoutGuide
self.menuStack.topAnchor.constraint(equalTo: safeGuide.topAnchor).isActive = true
self.menuStack.bottomAnchor.constraint(equalTo: self.tableView.topAnchor, constant: 50).isActive = true
self.tableView.topAnchor.constraint(equalTo: safeGuide.topAnchor, constant: 100).isActive = true
} else {
// Fallback on earlier versions
}
self.menuStack.isHidden = false
} else {
//scroll down
self.menuStack.isHidden = true
if #available(iOS 11.0, *) {
let safeGuide = self.view.safeAreaLayoutGuide
self.tableView.topAnchor.constraint(equalTo: safeGuide.topAnchor).isActive = true
} else {
// Fallback on earlier versions
}
}
}
当用户将手指从 tableView 上移开时,似乎调用了 scrollViewDidEndDragging 函数,这发生在 tableView 开始其减速动画之前。我认为你应该改用 scrollViewDidScroll 。我试过了,它对我有用:
class ViewController: UIViewController {
@IBOutlet weak var menuStackView: UIStackView!
@IBOutlet weak var tableViewTopConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.dataSource = self
tableView.delegate = self
}
}
}
extension ViewController: UITableViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
menuStackView.isHidden = scrollView.contentOffset.y > CGPoint.zero.y
tableViewTopConstraint.constant = (scrollView.contentOffset.y > CGPoint.zero.y) ? 0 : 40
//CGPoint.zero.y is when the contentOffset is at the top
}
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = "\(indexPath.row)"
return cell
}
}
我也会 post 截图 UI 这样你就可以看到我的设计是如何设置的。