更改UIScrollView

时间:2015-07-27 17:41:43

标签: ios objective-c uiscrollview uipagecontrol

我使用的UIScrollView有几个需要显示的项目。我首次加载时,第一个项目位于UIScrollView的中间位置。我试图让下一个项目,第二个项目,部分显示,允许用户知道有更多的项目要看,因此导致他们滚动项目。

我要做的是配置它,以便用户可以像UIScrollView允许的那样随意滑动和滚动,但每次用户滑动时,我都希望UISCrollView自动停止在最靠近视图中心的任何项目上。

我已启用分页并了解分页的工作原理。我想要做的就是让我可以更改分页似乎创建的“固定页面点数”。启用分页后,它似乎将视图的总宽度除以2,创建3个停止点:一个位于左边视图的末尾,一个位于直接中心(视图宽度/ 2),另一个位于视图的最右边界。

如果有人知道如何更改停靠点或页面点数(CGPoints),无论它们被称为什么,我都会非常感激。下面是我想要实现的目标的图像。

  1. 视图加载第一个项目居中于中间。
  2. 用户向右滚动,然后在第2项停止,然后显示在屏幕中央。
  3. 再次将用户向右滚动,项目3现在居中。
  4. enter image description here

1 个答案:

答案 0 :(得分:1)

不幸的是,UIScrollView分页不能按照您希望的方式工作。

分页在内容大小内创建尽可能多的UIScrollView边界部分。例如,如果您的滚动视图的帧大小为200x200,内容为400x200,则会创建两个水平页面。如果它是600x200,它将创建三个水平页面,依此类推。

这意味着您将无法以可以查看其他元素的方式进行分页。

为此,我建议覆盖此方法:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

以下是与完全分页相同效果的示例。我会使用你的元素大小的targetOffset行来完成所有工作。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    float expectedOffset = targetContentOffset->x;
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width)
        return;
    CGFloat targetOffset = roundf(expectedOffset / scrollView.frame.size.width) * scrollView.frame.size.width;

    targetContentOffset->x = targetOffset;
}