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

UIScrollView-在拖动结束时更改内容偏移,uiscrollview,uiscrollviewdelegate,Uiscrollview,Uiscrollviewdelegate,我有一个已编程的滚动视图,如果你向下拉超过100px(即进入负y内容偏移,并启用了反弹),然后放开,滚动视图顶部的视图将变大100px(向下推其他所有内容)。为了使转换平滑,我尝试在此时将scrollview的内容偏移量调整100px,如下所示: func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePoi

我有一个已编程的滚动视图,如果你向下拉超过100px(即进入负y内容偏移,并启用了
反弹
),然后放开,滚动视图顶部的视图将变大100px(向下推其他所有内容)。为了使转换平滑,我尝试在此时将scrollview的内容偏移量调整100px,如下所示:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
    if scrollView.contentOffset < -100
    {
        scrollView.contentOffset.y += 100 // 
        makeTopViewTaller()
    }
}
func ScrollViewWillendDraging(scrollView:UIScrollView,withVelocity:CGPoint,targetContentOffset:UnsafemeutablePointer)
{
如果scrollView.contentOffset<-100
{
scrollView.contentOffset.y+=100//
makeTopViewHigher()
}
}
但是,contentOffset中的更改不会持续。通过在
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
            }
        }
    }
}
类MyCollectionView:UICollectionView
{
var isTransitioning:Bool=false
变量initialTransitioningY:CGFloat=0
覆盖变量contentOffset:CGPoint
{
得到
{
返回super.contentOffset
}
//此自定义设置器用于平滑过渡到大标题状态
设置
{
if(isTransitioning&&initialTransitioningY<0)
{
var oy=newValue.y
如果(oy==0&&contentOffset.y<-10)//这是为了避免在首次调用集合视图上的“reloadData”时出现闪烁,该视图将contentOffset.y设置为0,然后返回到其以前的状态
{
oy=contentOffset.y
}
super.contentOffset=CGPointMake(newValue.x,(initialTransitioningY+100)*(oy/initialTransitioningY))
}
其他的
{
super.contentOffset=newValue
}
}
}
}
当用户拉过转换点(在我的例子中是100px)并放开时,调用
ScrollViewWillendDraging
方法,
isTransitioning
属性设置为
true
initialTransitioningY
设置为集合视图的当前内容偏移量。调用
ScrollViewDiEndDecreating
时,
isTransitioning
属性设置回false

他很有魅力