我有一个编程的滚动视图,如果你下拉超过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的自然反弹减速应用于新值?
答案 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。
有魅力。