【问题标题】:UIScrollView: single tap scrolls it to topUIScrollView:单击将其滚动到顶部
【发布时间】:2011-05-27 16:50:19
【问题描述】:

我将 pagingEnabled 设置为 YES 的 UIScrollView,并以编程方式将其内容滚动到底部:

CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y = scrollView.contentSize.height - scrollView.frame.size.height;
[scrollView setContentOffset:contentOffset animated:YES];

它滚动成功,但在那之后,单击它的内容会向上滚动以抵消它在向下滚动之前的偏移量。仅当我以编程方式将 scrollView 的内容滚动到底部然后点击时才会发生这种情况。当我滚动到任何其他偏移然后点击时,什么都没有发生。

这绝对不是我想要的。应该如何解决?

提前非常感谢!

帖木儿。

【问题讨论】:

    标签: iphone uiscrollview paging


    【解决方案1】:

    这个小技巧可以防止 UIScrollView 在被点击时滚动。当滚动视图启用分页时,似乎会发生这种情况。

    在你的 UIScrollView 委托中添加这个方法:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        scrollView.pagingEnabled = self.scrollView.contentOffset.x < (self.scrollView.contentSize.width - self.scrollView.frame.size.width);
    }
    

    当滚动视图在水平滚动中到达右端时,这将禁用分页(我的用例,您可以轻松地将其调整到其他方向)。

    【讨论】:

      【解决方案2】:

      我刚刚弄清楚是什么导致了这个问题,以及如何避免它。如果在滚动视图上将 pagingEnabled 设置为 YES,则必须将 contentOffset 设置为滚动视图可见大小的倍数(即,您应该位于分页边界上)。

      具体例子:

      如果您的滚动视图(例如)高 460 像素,内容区域为 920,如果您想避免“滚动到点击开始”问题,则需要将内容偏移设置为 0 或 460。

      作为奖励,最终结果可能会更好看,因为您的滚动视图将与分页边界对齐。 :)

      【讨论】:

      • 哇,谢谢!但是,当您的内容高度不是帧高度的倍数时,您将无法获得正确的行为,对吗? :)
      • 不确定,但如果内容不是帧高的倍数,为什么要启用分页?
      【解决方案3】:

      以下解决方法确实有帮助(假设使用类别扩展 UIScrollView,因此“self”指的是它的实例):

      -(BOOL) scrolledToBottom
      {
          return (self.contentSize.height <= self.frame.size.height) ||
                 (self.contentOffset.y == self.contentSize.height - self.frame.size.height);
      }
      

      然后,有时应该在滚动视图到达底部的位置关闭 pagingEnabled。在委托中(pagingEnabled 当然是初始化的,因为只有在启用时才会出现问题):

      -(void) scrollViewDidScroll:(UIScrollView *)scrollView
      {
          if (scrollView.pagingEnabled == YES)
          {
              if ([scrollView scrolledToBottom] == YES)
                  scrollView.pagingEnabled = NO;
          }
          else
          {
              if ([scrollView scrolledToBottom] == NO)
                  scrollView.pagingEnabled = YES;
          }
      }
      

      【讨论】:

      • 谢谢!我已将我的案例的代码(向右滚动)简化为一行。在下面检查我的答案:)
      【解决方案4】:

      这似乎是一个错误:

      UIScrollView doesn't remember the position

      我已在 iOS 4.2(模拟器)上对此进行了测试,但问题仍然存在。

      【讨论】:

        【解决方案5】:

        在滚动 ScrollView 时,我建议使用

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

        rect 是你所追求的位置。 (在这种情况下,矩形将是滚动视图的顶部)。

        更改内容偏移量不是滚动滚动视图的正确方式。

        【讨论】:

        • 另一方面,也许我误解了这个问题:D
        • Accatyyc,谢谢您的回复。我用适当的 scrollRectToVisible: 调用替换了 setContentOffset:,但不幸的是,这并没有解决问题。
        猜你喜欢
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多