【问题标题】:UIScrollView works as expected but scrollRectToVisible: does nothingUIScrollView 按预期工作,但 scrollRectToVisible: 什么也不做
【发布时间】:2010-11-29 14:42:21
【问题描述】:

我以前用过UIScrollView,现在也在用,从来没有遇到过问题。我现在将它添加到一个旧应用程序中,虽然它按预期工作(我可以查看内容,用手指滚动,所有边界和大小都设置正确,因此内容中没有空白空间等.),我就是无法让scrollToRectVisible 工作。我什至简化了调用,使其仅移动到 0,0 位置:

 [scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];

或将其移至 0,200:

 [scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];

我什至制作了一个快速应用程序来测试它,我可以让scrollRectToVisible 按我的预期在那里工作。但在我的旧应用中,我似乎无法让它做任何事情。

我可以用setContentOffset: 让scrollView 滚动,但这不是我想要的。

此滚动视图及其内容由 IB 在 nib 中定义,并与 IBOutlet 一起使用。我在我的应用程序中用来处理滚动视图的唯一代码是

 [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];

(我只对垂直滚动而不是水平感兴趣)。

有人遇到过这样的问题吗?

我比较了两个应用中的 scrollView 属性,它们是相同的。

附录:

我的 scrollViews 框架是:0.000000 0.000000 480.000000 179.000000

我的 scrollViews contentSize 是:0.000000 324.000000

它仍然像我想要滚动到的矩形一样已经可见并且不需要滚动。不确定这是否正在发生。这只是最糟糕的事情。似乎很容易解决...

附录#2:

这就是我在没有scrollRectToVisible 的情况下所做的:

CGPoint point = myRect.origin;
if (![clefScrollView pointInside:point withEvent:nil]) {
    point.x = 0;
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
        point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
    [clefScrollView setContentOffset:point animated: YES];
}

关于此 scrollView 的其他所有内容都按预期工作,但 scrollRectToVisible。为什么?!?有什么疯狂的猜测吗?

【问题讨论】:

    标签: iphone uiscrollview


    【解决方案1】:

    对我来说,问题是子视图中的约束不明确。 检查是否设置了内容中的每个约束,即使布局显然不需要它。

    【讨论】:

      【解决方案2】:

      我遇到了与此问题相同的症状。scrollRectToVisible 没有按预期工作。我的问题是情节提要上的滚动视图有一个模棱两可的约束问题。一旦解决了这个问题,通话就可以正常工作了。当 scrollRectToVisible 调用未按预期工作时,需要检查其他内容。

      【讨论】:

        【解决方案3】:

        游戏有点晚了,但我遇到了同样的问题。虽然我绝对正确设置了我的滚动视图的内容大小 - 即使对于高度值也是如此。即使经过广泛检查以验证框架和内容大小 - 仍然无法正常工作。我不得不调整“边界”框架高度,然后一切正常。

        【讨论】:

          【解决方案4】:

          您可能需要检查并查看滚动视图的delaysContentTouches 属性是否设置为NO

          如果您在 scrollView 的子视图中通过触摸调用 scrollRectToVisiblesetContentOffset 方法,那么您的 scrollView 可能会通过延迟触摸来阻止操作。

          所以,请确保您在滚动视图中设置以下内容。

          scrollView.delaysContentTouches = NO;
          

          您很可能能够在动画设置为 YES 和不动画设置为 YES 的情况下移动滚动视图。

          【讨论】:

            【解决方案5】:

            我有过这样的,但没有用

            scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);
            

            我只是在改变contentSize 的高度,所以我认为这不会给我带来任何问题,但它确实......

            不得不改成这个

            scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);
            

            原来scrollView.contentSize.width 不一定从一开始就设置为有效值,所以最好给它一个特定值

            【讨论】:

              【解决方案6】:

              一个多月后,我终于弄明白了。虽然上面的替代方案运作良好,但它一直困扰着我,我不得不最终弄清楚。原来这是一个愚蠢的错误。

              这是我 viewDidLoad 中的旧代码,我在其中设置了滚动视图:

              [clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];
              

              scrollView 的高度或宽度的值不能为 0!我认为这已经过去了,因为我假设 ScrollView 大小以有效大小开始,而我错过了一个维度为零的事实!

              这行得通:

              [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
              

              希望这可以帮助那里的人。我确实花了太多时间来调试它。

              【讨论】:

              • 很好的侦探工作,mahboudz。 fwiw,我怀疑问题不在于 ScrollView 的尺寸不能为零,而是它必须足够大以包含请求的矩形!干杯,猎户座
              • 谢谢!我也对此有所了解(我设置的是高度而不是宽度)。
              • 这不太正确 - c.f.猎户座的回答如下(我的宽度/高度不为零,导致问题的不是“0”......)
              • 另外:请记住,如果您设置“zoomScale”,这会改变滚动视图的“contentSize”——有点令人惊讶,但这就是它的工作方式。所以......如果你缩小,并尝试缩放到“contentSize”的底部或右侧,它会默默地失败,因为 CURRENT contentSize 现在更小了......
              • 我以类似的方式完成了此操作,但 scrollRectToVisible 仍然无法正常工作。它在模拟器中工作,但不在设备上。请帮忙。
              【解决方案7】:

              如果您没有为“clefScrollView”设置框架,上述建议的解决方案可能仍然会出错。

              如果使用了上述解决方案,但仍然遇到同样的问题,请确保在设置内容视图之前已初始化 scollView(在本例中为 clefScrollView)框架。

              
              
                  clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];
              
                  [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
              
              
              
              

              【讨论】:

                【解决方案8】:

                是的,我在scrollRectToVisible:animated: 上没有成功,但setContentOffset:animated: 总是适合我。出于好奇,您为什么不想使用setContentOffset:animated:?这似乎是正确的解决方案。

                【讨论】:

                • 不幸的是,setContentOffset 将滚动到该点,无论它是否已经可见。我可以做额外的工作来确定该点是否可见,但是,当我看到它在我自己的示例和网络上的其他示例中工作时,我仍然很好奇为什么 scrollRectToVisible 不起作用。我一定是做错了什么,但是scrollView只有三四行代码,我看不到什么?!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-30
                • 2020-03-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多