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

时间:2016-01-18 05:39:33

标签: uiscrollview uiscrollviewdelegate

我有一个编程的滚动视图,如果你下拉超过100px(即进入负y内容偏移并启用bounces),那么放开,滚动视图顶部的视图变得更大100px(推动其他一切)。为了使转换顺利,我试图在此时将scrollview的内容偏移调整100px,如下所示:

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

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

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

1 个答案:

答案 0 :(得分:1)

我尝试了很多不同的方法解决这个问题,但最终工作的方法包括创建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属性设置为true和{{1设置为集合视图的当前内容偏移量。调用initialTransitioningY时,scrollViewDidEndDecelerating属性将设置为false。

有魅力。