无论contentSize / Offset如何,UIScrollView都会阻止向一个方向滚动

时间:2011-09-28 14:38:55

标签: objective-c ios uiscrollview uiswipegesturerecognizer

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

例如,某人可能会通过一个包含10个问题的测试(每页一个问题),但除非该人在当前页面回答了问题,否则滚动将无效。

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

我注意到有几个人玩弄了内容偏移,但我觉得这个解决方案难看,因为用户仍然可以刷卡,只是应用程序会自动重新调整内容偏移量。我希望它就好像视图已经到达内容的末尾或者是否禁用了用户交互。

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

我尝试过将自定义视图用于锁定特定方向的页面,但是它无法正常工作,因为我无法找到防止滚动视图检测到滑动而不影响刷卡应该工作的方法一种正常的方式。我看到我可以将自定义视图的exclusiveTouch属性设置为YES并假设因为它将获得所有事件,我可以通过自定义手势识别器处理滑动并在允许滑动时转发事件或者如果没有则忽略它们。它不起作用,ScrollView总是捕获滑动事件。

我觉得我已经筋疲力尽了,我找不到任何有类似需求的人。

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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];
    }
}