【问题标题】:UIScrollView gets disabled in one direction - iOSUIScrollView 在一个方向上被禁用 - iOS
【发布时间】:2013-05-23 12:41:50
【问题描述】:

我有一个没有垂直滚动的 UIScrollView,并且我在其上强制一个特定的偏移量(只有 x),以防偏移量试图变得小于该特定偏移量。 我使用setContentOffset:animated: 函数,animated 参数为YES。偏移被正确强制。

在我强制偏移后,“有时”在与初始滚动方向相反的方向上滚动会被阻止。比如说,我用手指从左到右滚动,并强制它偏移一些,然后我不能再从右到左滚动了。

但问题是,如果我在屏幕上点按任何按钮,就会开始滚动。我无法平移,但如果我点击屏幕或点击任何按钮,滚动就会开始工作。如果我尝试在之后以编程方式调用按钮按下方法,比如强制偏移 5 秒,那么它不起作用。看来我需要以某种方式触摸屏幕..

我检查了contentOffsetcontentSize 的值,它们看起来不错。

PS:有时scrollViewDidEndScrollingAnimation: 方法在强制偏移后没有被调用,但这不一定是问题。

编辑:实际上,当我用手指将滚动视图超出阈值偏移量并继续向左平移时,就会发生这种情况。在阈值点,平移停止,但下次我尝试滚动时,它不会平移。 (即,我不会急于超过阈值)。

编辑: 另一个可能的漏洞:我在强制新偏移量之前使scrollEnabled 等于NO,并且在发出设置新偏移量的命令之后,我将其设置回来到YES。我需要这样做,以便如果我尝试用 jerk 滚动滚动视图,它不会在尝试设置新偏移量时向左滚动,因为启用了分页。

编辑:可能是因为我在实际使用触摸滚动时将scrollEnabled 设置为NO?我稍后会启用它,但也许这是个问题...

重要编辑:如果我长按滚动视图,然后尝试移动,滚动视图开始滚动!

编辑:此代码在scrollViewDidScroll:

if ((theScrollView.contentOffset.x < theScrollView.frame.size.width)
        && [currentlyDisplayedVC isEqual:VC1])
    {
        //if this is not done, and this call happens when VC3
        //is visible a bit too much, scrollView scrolls till VC3.
        scrollView.scrollEnabled = NO;

        [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width, 0) animated:YES];
        scrollView.scrollEnabled = YES;

        //this is done so that this block is not reached everytime during scroll animation.
        currentlyDisplayedVC = VC2;
    }

然后在scrollViewDidEndWithANimation:我添加[self VC2reached]

【问题讨论】:

  • 等等,你是说如果你在一个方向上平移,你以编程方式强制 contentOffset,那么你不能继续平移?如果您抬起手指然后再次开始平移会怎样?这行得通吗?
  • 不,没有。我抬起手指并尝试平移,旋转设备并尝试平移,但没有任何效果。
  • 实际上,当我用手指将滚动视图超出阈值偏移量并继续向左平移时,就会发生这种情况。在阈值点,平移停止,但下次我尝试滚动时,它不会平移。 (即,我不会急于超过阈值)。
  • 如果您发布一些代码,我们可能会很容易地为您解决这个问题。
  • 我已经添加了相关的代码...

标签: ios uiscrollview scroll


【解决方案1】:

您是否尝试过使用 setUserInteractionEnabled:NOYES 来停止/允许用户与 UIScrollView 交互,而不是使用 scrollEnabled 属性?

【讨论】:

  • 是的,我有。没有帮助,因为滚动实际上不是由于使用 rinteraction
【解决方案2】:

我继承了 UIScrollView 并覆盖了方法 touchesShouldBegin:withEvent:inContentView:。在该方法中,当我看到视图卡住的那个特定时刻,我返回NO,以便滚动视图接受所有触摸,而不是将它们传递给任何其他内容视图。这样就解决了问题。

编辑:这实际上并不能解决问题。我只想在尝试滚动滚动视图时禁止触摸 contentView,而不是在尝试点击 contentView 等其他事件时。但是在我发布的解决方案中,所有触摸都将保留在滚动视图中。我们有类似的touchMoved: 方法吗?

【讨论】:

    【解决方案3】:

    而不是使用setContentOffset:animated:

    你应该尝试使用scrollRectToVisible:animated:

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2017-01-26
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多