【问题标题】:Material floating action button should invisible when user scroll down and visible when scrolls up当用户向下滚动时,材质浮动操作按钮应该不可见,向上滚动时应该可见
【发布时间】:2019-06-27 09:22:54
【问题描述】:

我在屏幕右下方有材质浮动操作按钮 (FAB)。 另外,我在 View 中有 CollectionView。我希望完成以下操作。

  1. 当用户向下滚动时 - FAB 应该不可见。
  2. 当用户向上滚动时 - FAB 应该可见。

我在 google 中到处搜索。没有一个问题满足我的要求。

【问题讨论】:

    标签: ios swift uicollectionview uiscrollview


    【解决方案1】:

    别忘了设置collectionView.delegate = self。

    extension ViewController: UIScrollViewDelegate{
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            if scrollView == collectoinView{
                button.isHidden = scrollView.contentOffset.y > 50
            }
        }
    }
    

    50Y 的位置,按钮将从该位置隐藏。您可以根据您的要求调整到任何数字。


    另一种方法

    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    
        let targetPoint = targetContentOffset as? CGPoint
        let currentPoint = scrollView.contentOffset
    
        if (targetPoint?.y ?? 0.0) > currentPoint.y {
            print("up")
    
        } else {
            print("down")
         }
    }
    

    使用第二种方法,不需要提供静态值。第二种方法已从objective-c Answer转换为Swift

    【讨论】:

    • @Eswar 很高兴它有帮助。不要忘记投票并接受答案。谢谢
    • 按钮隐藏效果很好。但是 - 按钮仅在显示第一个单元格时才可见。如果用户向上滚动而不考虑单元格计数,我希望它显示出来。
    • 您可以根据自己的要求更改值50
    • 我不想给出任何静态值。我只需要知道用户是向上还是向下滚动。如果 UP - 按钮应该可见,如果 DOWN - 按钮应该隐藏。我怎样才能做到这一点?
    • @Eswar 以另一种方式添加。
    【解决方案2】:

    您可以为此使用 scrollViewDidScroll。

         func scrollViewDidScroll(scrollView: UIScrollView!) {
        if (self.lastContentOffset > scrollView.contentOffset.y) {
            // show your button
        }
        else if (self.lastContentOffset < scrollView.contentOffset.y) { 
           // hide your button
        }
    
        // update the new position acquired
        self.lastContentOffset = scrollView.contentOffset.y
    }
    

    【讨论】:

    • 当我尝试您的代码时 - 引发此错误“'ViewController' 类型的值没有成员'lastContentOffset'”。
    • 对不起。我忘了添加这个。 lastContentOffset 是一个简单的 CGFloat 变量。您应该在代码中的某处添加它。 (就像这个 var lastContentOffset : CGFloat = 0)
    【解决方案3】:

    https://i.stack.imgur.com/OQGGO.png

    1. 调用方法 ---> func scrollViewWillEndDragging
    2. 调用动画的方法 --> func setView

    【讨论】:

    • 请在这里写下你的代码,而不是上传图片,这样其他人可以复制粘贴并测试你的代码,然后很容易评估
    • 是的,下次我将粘贴代码对不起,现在
    【解决方案4】:

    这是上面的代码。

     func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
         moveDownButton.isHidden = false
        
        if targetContentOffset.pointee.y < scrollView.contentOffset.y {
            //Going up
            setView(view: self.moveDownButton, hidden: false)
        } else {
            //Going Down
            setView(view: self.moveDownButton, hidden: true)
        }
    }
    
    func setView(view: UIView, hidden: Bool) {
        view.isHidden = hidden
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多