【Swift】一番下までスクロールしたらボタンを消す方法

今回はSwiftで一番下までスクロールしたらボタン(UIButton)を消す方法について解説します。

実装方法

手順1: UIScrollViewDelegateを継承する

まず、UIScrollViewDelegateを継承しましょう。

extension HogeViewController: UIScrollViewDelegate {

}

そして、対象のUIButtonにdelegateを適用させます。

この一行は忘れがちなので注意しましょう!

button.delegate = self

手順2: scrollViewDidScrollを使用して一番下までのスクロールを検知する

extension HogeViewController: UIScrollViewDelegate {
    // 一番下までスクロールしたらボタンを非表示にする
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let top = scrollView.contentOffset.y
        let bottom = top + scrollView.frame.size.height
        let isHidden = top > 0 && scrollView.contentSize.height <= bottom
        self?.button.isHidden = isHidden
    }
}

scrollViewDidScroll(_ scrollView: UIScrollView)というのを使います。

こちらはスクロール中は常に呼び出されます。

Apple Developer Documentation

この中で以下のことを行なっています。

  • scrollViewの上端を取得(top)
  • scrollViewの下端を取得(bottom)
  • スクロール位置が上端におらず、かつ(画面の一番上から)scrollViewまでの高さがbottomまでの高さ以下の場合に隠す

みたいなことをしています。(説明難しい。。。)

なぜスクロール位置が上端にいないことを条件にしているかというと、

スクロールしなくていいほど画面が大きい場合にこの条件がないと消えてしまうからです。

このようにすると、一番下までスクロールしたら消え、それ以外の位置では表示されるようになります。

補足:ふんわり消えるアニメーションをつけたいなら

もし表示・非表示をアニメーション付きで切り替えたいなら、こちらでできます!

extension HogeViewController: UIScrollViewDelegate {
    // 一番下までスクロールしたらボタンを非表示にする
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let top = scrollView.contentOffset.y
        let bottom = top + scrollView.frame.size.height
        let isHidden = top > 0 && scrollView.contentSize.height <= bottom
        UIView.animate(withDuration: 0.5) { [weak self] in
            self?.button.alpha = isHidden ? 0 : 1
        }
    }
}

以上、参考になったら嬉しいです。

こういうのって思ったよりも難しいもんですね😅

コメント

タイトルとURLをコピーしました