>我有一个经过编程的滚动视图,因此如果您下拉超过 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
属性设置为 true
,initialTransitioningY
设置为集合视图的当前内容偏移量。调用 scrollViewDidEndDecelerating
时,isTransitioning
属性将设置回 false。
工作魅力。