UIScrollView向子视图发送触摸

Rui*_*res 9 iphone uiscrollview uiview ipad ios

注意:我已经阅读了一些关于UIScrollView子视图发送方式的问题(包括这个问题,虽然我已经投了票,但它不再符合我的预期).

我有什么:我有一个UIScrollView自定义UIView(让我们称之为A)里面覆盖整个UIScrollView.我也被允许UIViewsA中放入其他自定义.

在我这样做的代码上:

[scrollView setDelaysContentTouches:YES];
scrollView.canCancelContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)

发生了什么:目前我的唯一问题是,如果我想在A中移动子视图,我必须触摸它,等待,然后移动它.正如这里所述:

现在,行为会根据UIView上第一次触摸的"时间长度"而变化.如果它很短,则管理相对拖动,因为它是UIScrollView的滚动.如果它很长,那么我将在我的UIView中获得touchesMoved:事件.

我想要的是:A中的子视图应始终优先,我不应该触摸和等待.如果我触摸A而不是它的子视图,我希望UIScrollView接收触摸,如平移和移动(contentSize比大于frame).


编辑1.0

我在通用内部使用此A视图的唯一原因UIScrollView是因为我希望能够放大/缩小A视图.所以我正在做以下事情:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return customView; // this is the A view
}
Run Code Online (Sandbox Code Playgroud)

一开始我没有内部的A视图UIScrollView,我唯一做的就是添加A作为我的UIViewController's根视图的子视图,一切顺利.如果有另一种方法可以放大/缩小,我很乐意接受答案.

Rui*_*res 8

注意:谢谢大家的贡献,特别是给Aaron Hayman.

通过在UIScrollView我所拥有的子类上执行以下操作,我能够弄明白:

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
   CGPoint pointOfContact = [gestureRecognizer locationInView:self];

    // The view with a tag of 200 is my A view.
    return (![[self hitTest:pointOfContact withEvent:nil] isEqual:[self viewWithTag:200]]);
}
Run Code Online (Sandbox Code Playgroud)

  • 太好了,我应该推荐子类化 UIScrollView。我想补充一点,您可能需要区分`UIScrollView` 的手势识别器。例如,您可能想要取消轻拍和平移,但不想捏合(缩放)。当 `locationInView` 返回一个子视图中的一个点时,有时捏合不起作用可能会令人不安。您应该能够轻松地使用以下内容执行此操作:`if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]) return YES;`。 (2认同)