【问题标题】:Detect touch location on UIScrollView ?检测 UIScrollView 上的触摸位置?
【发布时间】:2013-06-25 00:57:33
【问题描述】:

我想在用户开始拖动时检测 UIScrollView 中的(初始)触摸位置。我用谷歌搜索了这个问题,许多人似乎都在为这个问题而苦苦挣扎。现在,虽然我仍然无法理解为什么 Apple 不允许用户在滚动视图中访问触摸信息,但我还是忍不住自己找到了解决方案。但是我所有的尝试都失败了,所以我想问你。

这是我认为可行的方法:

我在我的 UIScrollView 子类中设置了一个这样的 UIPanGestureRecognizer 并将其添加到它的手势识别器中:

UIPanGestureRecognizer *tapDrag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(touchedAndDragged:)];
tapDrag.cancelsTouchesInView = NO;
tapDrag.delegate = self;
[self addGestureRecognizer:tapDrag];  

以及对应的方法:

-(void)touchedAndDragged:(UIPanGestureRecognizer*)t{

     CGPoint loc = [t locationInView:self];
     //do something with location (that is exactly what I need)
     //...

     //Now DISABLE and forward touches to scroll view, so that it scrolls normally
     t.enabled = NO;
     /****
     ?????
     *****/

}

正如 cmets 所指出的,我想在获得点后禁用平移手势,然后禁用识别器(同时仍在拖动!)并将触摸“传递”到我的滚动视图,以便用户可以滚动一般。这完全可行吗?还有其他解决方案吗?

【问题讨论】:

    标签: ios uiscrollview touch uigesturerecognizer uiresponder


    【解决方案1】:

    UIScrollView 已经有一个内置的平移手势,您可以点击它。用法很简单,只需将您的类设置为滚动视图的委托(利用 scrollViewWillBeginDragging)并使用 UIPanGestureRecognizer 的 -locationInView: 来确定触摸位置。

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView];
        NSLog(@"%@",NSStringFromCGPoint(location));
    }
    

    【讨论】:

    • 是否可以检测到此滚动是否在某个 xx 位置,则不会触发 scrollView 滚动或触摸?假设我在滚动视图中有两个视图,地图和地图下方的面板,我不希望滚动视图在我触摸地图时触发它的委托,而地图应该得到它的触摸
    【解决方案2】:

    不如在-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event中抢起始位置,这样会更方便高效。

    【讨论】:

    • 我完全了解触摸功能,事实上,我尝试实现它们,但它们根本没有被调用。
    • 未启用用户交互。但是禁用它,它会。但是你将无法与它的任何子对象进行交互......
    猜你喜欢
    • 2013-03-23
    • 2016-02-06
    • 2013-04-12
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多