3

我有一个启用了分页的 UIScrollView,但我希望能够防止用户在某些情况下滑动到下一页或返回上一页。

例如,某人可能通过了包含十个问题(每页一个问题)的测试,但除非该人已回答当前页面上的问题,否则滚动将不起作用。

也可能是为了防止他们滑回上一页。所以基本上我不能使用方向锁定或暂时禁用用户交互,因为可以允许读者向左滑动但不能向右滑动。

我注意到一些人在玩内容偏移,但我发现这个解决方案很难看,因为用户仍然可以滑动,只是应用程序会自动重新调整内容偏移。我希望它就像视图已经到达内容的末尾或者用户交互被禁用一样。

我想我可能可以“播放”内容大小/偏移量并在每个页面上刷新它,但我不确定如何正确地做到这一点,因为我也有“链接”可以让某人从一个页面跳转到另一个页面(即当时可能超出定义的内容)。

我尝试对锁定特定方向的滑动的页面使用自定义视图,但它不起作用,因为我找不到阻止滚动视图检测到滑动而不影响页面的方法滑动应该以正常方式工作. 我看到我可以将自定义视图的 ExclusiveTouch 属性设置为 YES,并假设由于它将获取所有事件,我可以通过自定义手势识别器处理滑动,如果允许滑动则转发事件,否则忽略它们。它不起作用,ScrollView 总是捕获滑动事件。

我觉得我已经用尽了所有的可能性,我找不到任何有类似需求的人。

所以我想知道,这甚至可能吗?如果是,是否需要糟糕的黑客攻击或制作新的自定义滚动视图?

任何帮助/想法将不胜感激。

4

2 回答 2

1

在代码中您希望锁定滚动/分页的适当位置使用您的条件,并将您的 scrollView 对象的 pagingEnabled 或 scrollEnabled 设置为 NO。

编辑:

应该更仔细地阅读您的要求。根据您的需要,更好的解决方案是使用多个视图根据您的条件从侧面滑入和滑出。动画他们。手势识别器也应该有所帮助。我不是在说scrollView。View1 -> 条件 -> 通过?(按钮动作或手势)-> 动画到 view2 等等。

如果你真的必须使用scrollView,你可以做的最好的是将contentSize设置为屏幕的宽度,并将alwaysBounceHorizo​​ntal设置为NO,以防止自动弹跳效果:

CGRect size = scrollView.contentSize;
size.width = CGRectGetWidth(scrollView.frame);
scrollView.contentSize = size;
scrollView.alwaysBounceHorizontal = NO;
于 2011-09-28T15:06:59.100 回答
0

在另一篇文章中发现,这就是我解决同样问题的方法。

把它放在你的视图控制器中并将它设置为 UIScrollView 的委托

CGPoint oldOffset;  // instance variable

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    oldOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.x < oldOffset.x) 
    {
        [scrollView setContentOffset:oldOffset];
    }
}
于 2013-05-07T00:36:48.633 回答