UIScrollView:仅在允许时滚动

Posted

技术标签:

【中文标题】UIScrollView:仅在允许时滚动【英文标题】:UIScrollView: Only scroll when allowed 【发布时间】:2013-04-29 19:06:40 【问题描述】:

我一直在尝试只让我的UIScrollView 向一个方向滚动并且仍然获得所有UITouch 事件。我根本不完全确定这是可能的。

我试图覆盖UIResponder 的“触摸”事件,但是一旦UIScrollView 开始滚动,触摸方法就会停止调用。

然后我尝试将UIScrollViewscrollEnabled 属性设置为false,直到我希望UIScrollView 开始接收拖动事件,但我似乎找不到让UIScrollView 开始的方法在拖动中接收触摸事件。 这可能吗?

我的下一个尝试是在滚动视图中添加“填充”,并通过使用contentOffset 属性创建我自己的“触摸事件”,但这开始调用scrollViewDidScroll: 的次数过多并且处理得像疯了似的——回复的有效性也存在一些问题。

我玩过hitTest:withEvent:pointInside:withEvent:touchesShouldBegin:withEvent:inContentView:touchesShouldCancelInContentView:,但没有成功。

从那以后,我尝试了其他一些方法,但都没有奏效。另外,根据我的发现,将 delaysContentTouches 设置为 false 会破坏滚动响应。

我会喜欢一些 real 被覆盖的触摸方法。如果我不调用 super,UIScrollView 不会收到触摸的方法。

我需要一种方法来获取UITouches(拖动、开始、释放和取消,而不仅仅是点击),而不会影响UIScrollView 的滚动,因为UIResponder“触及“一旦滚动开始,事件就会消失。这可能吗?

【问题讨论】:

【参考方案1】:

如果您只想检测常见的touches,请尝试将gesture recognizers(如UITapGestureRecognizer)附加到您的view,即使使用UIScrollView,它们也应该可以工作。

您也可以尝试在scrollview 上放置一个透明的UIView,以检测一些touches,并将其余部分传递给scrollview

【讨论】:

在拖动中传递触摸不允许滚动视图滚动。另外,我不是在寻找点击,而是所有事件的触摸(尤其是拖动)。 然后尝试制作一个自定义手势识别器来捕获您想要的事件。看到这个:developer.apple.com/library/ios/#documentation/uikit/reference/… 这可能有用:iphonedevsdk.com/forum/iphone-sdk-tutorials/… 谢谢,但是,第二个帖子无关紧要。如果您查看here,它在 SDK 3.0 中停止工作。不幸的是,我已经看到了其中的大部分内容。 我已经使用自定义 UIGestureRecognizer 和实现解决了这个问题。谢谢!【参考方案2】:

当您开始滚动时,保存偏移量的副本。然后在完成滚动时检查它。此代码允许向左滚动,但阻止向右滚动

CGPoint oldOffset;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    oldOffset = scrollView.contentOffset;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    if (scrollView.contentOffset.x < oldOffset.x) 
        [scrollView setContentOffset:oldOffset];
    

【讨论】:

我很欣赏这个想法,但我需要拖拽的感觉。那只会给我起点和终点之间的距离。

以上是关于UIScrollView:仅在允许时滚动的主要内容,如果未能解决你的问题,请参考以下文章

拦截 UIScrollView 滚动

UIScrollview 仅在拖动 uiviews 时滚动

仅在滚动内容到达边缘时识别 UIScrollView 中的滑动手势

防止uiscrollview向右滚动

UIScrollView 显示为零?

禁用 UIScrollView 手势