我想要得到的是与此滚动视图相同的行为:
我知道这是使用 HTML 而不是本机 API,但我正在尝试将其实现为 UIKit 组件。
现在,对于我正在寻找的行为:
- 请注意,这是一个分页滚动视图,但“页面大小”小于视图的宽度。
- 当你从左到右滚动它时,每一页都会“捕捉”到最左边的项目。
- 当您从右端向左滚动它时,它会“捕捉”到最右边的项目。
相同的页面,但现在从右到左:
我试过的:
- 我尝试使滚动视图小于它的超级视图并覆盖 hitTest,这让我得到了从左到右的行为。
- 我已经尝试实现 scrollViewWillEndDragging:withVelocity:targetContentOffset: 并设置我想要的 targetContentOffset 但由于我无法更改速度,它只是滚动太慢或太快。
- 我已经尝试实现 scrollViewDidEndDecelerating: 然后动画到正确的偏移量,但滚动视图首先停止然后移动,它看起来不自然。
- 我尝试实现 scrollViewDidEndDragging:willDecelerate: 然后动画到正确的偏移量,但滚动视图“跳跃”并且动画不正确。
我没主意了。
谢谢!
更新:
我最终使用了 Rob Mayoff 的方法,它看起来很干净。我对其进行了更改,使其在速度为 0 时起作用,例如当用户拖动、停止和释放手指时。
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity
targetContentOffset:(CGPoint *)targetContentOffset {
CGFloat maxOffset = scrollView.contentSize.width - scrollView.bounds.size.width;
CGFloat minOffset = 0;
if (velocity.x == 0) {
CGFloat targetX = MAX(minOffset,MIN(maxOffset, targetContentOffset->x));
CGFloat diff = targetX - baseOffset;
if (ABS(diff) > offsetStep/2) {
if (diff > 0) {
//going left
baseOffset = MIN(maxOffset, baseOffset + offsetStep);
} else {
//going right
baseOffset = MAX(minOffset, baseOffset - offsetStep);
}
}
} else {
if (velocity.x > 0) {
baseOffset = MIN(maxOffset, baseOffset + offsetStep);
} else {
baseOffset = MAX(minOffset, baseOffset - offsetStep);
}
}
targetContentOffset->x = baseOffset;
}
此解决方案的唯一问题是滑动滚动视图不会产生“反弹”效果。感觉“卡住”了。