UIScrollView:仅在允许时滚动

时间:2013-04-29 19:06:41

标签: ios objective-c cocoa-touch uiscrollview uiresponder

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

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

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

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

我使用过scrollViewDidScroll:hitTest:withEvent:pointInside:withEvent:touchesShouldBegin:withEvent:inContentView:但没有取得任何成功。

我尝试过其他一些事情,但是没有一个有效。另外,根据我的发现,将touchesShouldCancelInContentView:设置为false会破坏滚动响应。

我会喜欢一些真正的重写的触摸方法。如果我不调用超级的方法,则delaysContentTouches不会接收到触摸。

我需要一种方法来获取UIScrollView es(拖拽,开始,释放和取消,而不仅仅是点击),而不会影响UITouch的滚动,因为{滚动开始后,{1}}“触摸”事件会立即下降。这可能吗?

2 个答案:

答案 0 :(得分:1)

如果您只想检测常见touches,请尝试将gesture recognizers UITapGestureRecognizer添加到view,即使UIScrollView也可以使用。{ / p>

您还可以尝试在UIView上方放置一个透明的scrollview,以检测某些touches,然后将其余内容传递给scrollview

答案 1 :(得分:0)

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

CGPoint oldOffset;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    oldOffset = scrollView.contentOffset;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.x < oldOffset.x) {
        [scrollView setContentOffset:oldOffset];
    }
}