Как сделать так, чтобы вид стека исчезал при прокрутке вниз и снова появлялся при прокрутке вверх? - PullRequest
1 голос
/ 09 октября 2019

Я создал вид стека с 2 кнопками, которые называются

Службы и настройка

Моя цель - заставить этот вид стека исчезнуть при прокрутке вниз и отображенииснова, когда я прокручиваю вверх. Все работает, как и должно быть, когда я прокручиваю вниз, но когда я прокручиваю вверх, представление стека, я назвал его

menuStack

, оно перекрывается с представлением таблицы. TableView - это тот, который содержит изображения обуви, как вы можете видеть на скриншоте.

Я попробовал этого делегата для просмотра прокрутки, но мне кажется, что в моих якорях чего-то не хватает. Вот 3 скриншота каждого события.

Это представление по умолчанию

Когда я прокручиваю вниз

Когда я прокручиваю меню вверх, стэк не появляется снова

    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
        }
    }
}

1 Ответ

1 голос
/ 09 октября 2019

Кажется, что функция scrollViewDidEndDragging вызывается, когда пользователь убирает палец с tableView, это происходит до того, как 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
    }
}

Я также выложу скриншот интерфейса, чтобы вы могли увидеть, как настроен мой дизайн.

Updated

...