【问题标题】:UIScrollView: Only scroll when allowedUIScrollView:仅在允许时滚动
【发布时间】: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“触及“一旦滚动开始,事件就会消失。这可能吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在拖动中传递触摸不允许滚动视图滚动。另外,我不是在寻找点击,而是所有事件的触摸(尤其是拖动)。
    • 然后尝试制作一个自定义手势识别器来捕获您想要的事件。看到这个:developer.apple.com/library/ios/#documentation/uikit/reference/…
    • 谢谢,但是,第二个帖子无关紧要。如果您查看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];
        }
    }
    

    【讨论】:

    • 我很欣赏这个想法,但我需要拖拽的感觉。那只会给我起点和终点之间的距离。
    猜你喜欢
    • 2012-07-15
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多