如何在滚动时隐藏 UIView?

Posted

技术标签:

【中文标题】如何在滚动时隐藏 UIView?【英文标题】:How to hide a UIView while scrolling? 【发布时间】:2017-10-11 15:35:38 【问题描述】:

我正在努力实现这个效果。

我试图在用户向上滚动时隐藏视图,并在用户向下滚动时显示它。

我不知道该怎么做。 我曾尝试将其视为 scrollView didScroll 功能,但我不知道如何设置它。有什么建议吗?

【问题讨论】:

显示到目前为止你做了什么? 另外确认一下,你的视图是简单的 UIView 还是 tableView 还是 collectionView ? 我敢打赌,在didScroll 方法中记住scrollView 的最后一个contentOffset。然后,如果您看到 scrollView 上升,您应该将您的自定义视图移动(动画)到某个点(正如我与 alpha 一起看到的)。当你注意到它下降时,做相反的事情(也仅限于某个点)。 @cole 我什么都没做,因为我什至不知道从哪里开始。你们不必给我一个代码答案。我可以弄清楚。我需要什么我将如何去做。 @cole 甚至我的谷歌搜索也很困难。我是否搜索“隐藏标题”?我不确定这叫什么。我正在使用 UICollectionView。但我也会对 UITableView 进行解释。我认为它们都是 UIScrollView 的子类。 【参考方案1】:

Hiding content on scroll

请检查这个库,它与您附加的 gif 完全一样。

另一种方法是从您附加的 gif 文件中获取。 在顶部添加搜索栏。并将隐藏部分作为标题并对齐搜索栏和表格视图以获得该动画。

【讨论】:

【参考方案2】:

我是这样解决的:

private var lastContentOffset: CGFloat = 0

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) 
   lastContentOffset = scrollView.contentOffset.y


func scrollViewDidScroll(_ scrollView: UIScrollView) 
    if lastContentOffset > scrollView.contentOffset.y 
        UIView.animate(withDuration: 0.25, animations:  [weak self] in
            self?.addDeviceButton.alpha = 1.0
            self?.addDeviceButton.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        , completion: nil)
     else if lastContentOffset < scrollView.contentOffset.y 
        UIView.animate(withDuration: 0.25, animations:  [weak self] in
            self?.addDeviceButton.alpha = 0
            self?.addDeviceButton.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        , completion: nil)
    

【讨论】:

【参考方案3】:

你需要设置滚动视图的容器视图和你想要隐藏的视图作为滚动视图的代理,注册这个类以符合 UIScrollViewDelegate 协议。

您还需要跟踪滚动视图的内容偏移属性,并将其设置为滚动视图创建时的初始偏移量:

fileprivate var scrollOffset : CGPoint

然后,如你所说,使用 scrollViewDidScroll 方法:

internal func scrollViewDidScroll(_ scrollView: UIScrollView) 
    let delta : CGPoint = CGPoint(x: scrollView.contentOffset.x - scrollOffset.x, 
        y: scrollView.contentOffset.y - scrollOffset.y)

    if delta.y > 0, subviewToFade.isDescendant(of: self) 
           // fade out subviews and remove
    else if delta < 0, !subviewToFade.isDescendant(of: self) 
           // add subviews and fade back in

    

    scrollOffset = scrollView.contentOffset

希望对您有所帮助。

【讨论】:

【参考方案4】:

here is my constraints

func scrollViewDidScroll(_ scrollView: UIScrollView) 

    setPosition(scrollView)


func setPosition(_ scrollView:UIScrollView) 

    if scrollView.contentOffset.y >= 20 
        self.parentTopViewcontraints.constant = -95 // set postition till you want to hide your view 
        UIView.animate(withDuration: 0.5) 
            self.view.layoutIfNeeded()
        
    else if scrollView.contentOffset.y <= 200 
        self.parentTopViewcontraints.constant = 0 //set back 
        UIView.animate(withDuration: 0.5) 
            self.view.layoutIfNeeded()
        
    

【讨论】:

欢迎来到***。请简要说明此代码的作用以及它如何解决问题中的问题。

以上是关于如何在滚动时隐藏 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

如何中断 UIView 动画

如何在滚动视图中隐藏和取消隐藏 UiViews 中的浮动按钮?

如何在滚动时更改 UIView 大小并延迟

当调整大小小于元素时,如何使元素隐藏在 UIView 中

如何在更改uiview的隐藏模式时添加动画?

当我无法使用 UIScrollView 时,如何在自定义 UIView 中模拟惯性滚动?