1

我有一个全屏 UIScrollView,它根据当前滚动位置执行自定义操作。在位于其上方但不在同一层次结构中的层上,我有一个 UIImageView,它具有一个轻击手势识别器,可将控制权发送到给定的选择器。

我的目标是:

  • 如果用户点击 UIImageView,点击手势识别器会运行选择器(发生这种情况)
  • 如果用户在屏幕上的其他地方向上或向下滑动 UIScrollView 委托会发挥其魔力(这也会发生)
  • 如果用户从 UIImageView 发起滑动(滚动),则将事件传递给 UIScrollView(这不会发生)

我知道如果 UIImageView 是 UIScrollView 的子视图可以实现这一点,但我想避免这种情况,因为 UIImageView 并不意味着滚动 UIScrollView 的内容。无论如何,我可以将 UIImageView 中的“滚动”触摸事件传递给 UIScrollView 对象,而不使其成为滚动视图的子视图?

4

2 回答 2

2

您可以requireGestureRecognizerToFail:在图像视图上使用点击手势识别器来传递滚动视图的平移手势识别器。如果滚动视图的手势识别器不接受该事件,这应该只激活点击手势识别器。

于 2013-10-18T02:04:48.553 回答
0

我想提出以下解决方案。

AIImageView.m:

#import "AIImageView.h"

@implementation AIImageView
{
    NSInteger _cnt;
}

- (id)initWithImage: (UIImage*)image
{
    if ((self = [super initWithImage:image]))
    {
        [self setUserInteractionEnabled: YES];

        UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget: self
                                                                                     action: @selector(handleTapGesture:)];
        tapGesture.delegate = self;
        [self addGestureRecognizer: tapGesture];

        _cnt = 0;
    }
    return self;
}

- (UIView*) hitTest: (CGPoint) point withEvent: (UIEvent*) event
{
    CGPoint result = [self convertPoint: point toView: self.scrollView];

    _cnt++;

    if (CGRectContainsPoint(self.frame, result))
    {
        if (_cnt > 2)
        {
            _cnt = 0;
        }
        else
        {
            return self.scrollView;
        }
    }

    return [super hitTest: point withEvent: event];
}

- (void) handleTapGesture: (id) sender
{
    NSLog(@"TAP!!!");
}

@end

AIImageView.h:

#import <UIKit/UIKit.h>

@interface AIImageView : UIImageView <UIGestureRecognizerDelegate>

@property(nonatomic, strong) UIScrollView* scrollView;

@end

创建图像视图:

UIImage* image = [UIImage imageNamed: @"default_cover.png"];
imageView = [[AIImageView alloc] initWithImage: image];
imageView.frame = CGRectMake(100, 400, 100, 100);
imageView.scrollView = self.scrollView;
[self.view addSubview: imageView];

如果您尝试一下,您会发现此解决方案有效,但并非总是如此:)。但我相信它可以帮助你。

于 2013-10-18T01:15:26.027 回答