UIScrollView - 拖动结束时更改内容偏移量



>我有一个经过编程的滚动视图,因此如果您下拉超过 100px(即下拉到 y 内容偏移量并启用bounces),然后放开,滚动视图顶部的视图会变大 100px(将其他所有内容向下推)。为了使过渡顺利,我正在尝试将滚动视图的内容偏移量调整 100px,如下所示:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
    if scrollView.contentOffset < -100
    {
        scrollView.contentOffset.y += 100 // 
        makeTopViewTaller()
    }
}

但是,内容偏移量中的更改不会坚持。通过在scrollViewDidScroll()方法中记录内容偏移量,我可以看到 y 值在一瞬间发生了变化,但随后又回到拖动结束时的位置。

有没有办法强制内容偏移量更改,然后让 UIScrollView 的自然反弹欺骗应用于新值?

我尝试了一大堆不同的方法来解决这个问题,但最终有效的方法涉及创建 UIScrollView 的子类(在我的例子中,实际上是一个 UICollectionView)并覆盖 contentOffset 属性的 setter。这是我的子类:

class MyCollectionView : UICollectionView
{
    var isTransitioning:Bool = false
    var initialTransitioningY:CGFloat = 0
    override var contentOffset:CGPoint
    {
        get
        {
            return super.contentOffset
        }
        // This custom setter is to make the transition to the large header state smooth
        set
        {
            if(isTransitioning && initialTransitioningY < 0)
            {
                var oy = newValue.y
                if(oy == 0 && contentOffset.y < -10) // This is to avoid a flicker when you first call 'reloadData' on the collection view, which sets the contentOffset.y to 0, then returns to it's previous state
                {
                    oy = contentOffset.y
                }
                super.contentOffset = CGPointMake(newValue.x, (initialTransitioningY + 100) * (oy / initialTransitioningY))
            }
            else
            {
                super.contentOffset = newValue
            }
        }
    }
}

当用户拉过过渡点(在我的例子中为 100px)并松开时,将调用 scrollViewWillEndDragging 方法,并将 isTransitioning 属性设置为 trueinitialTransitioningY设置为集合视图的当前内容偏移量。调用 scrollViewDidEndDecelerating 时,isTransitioning属性将设置回 false。

工作魅力。

最新更新