2013-10-18 152 views
1

我有一个全屏UIScrollView,它根据当前滚动位置执行自定义操作。在一个放置在它上面的图层上,但是它不在同一个层次结构中,我有一个UIImageView,它有一个轻击手势识别器,它将控制权发送给给定的选择器。将事件传递给iOS中的另一个对象Objective C

我的目标会是这样:

  • 如果用户点击的UIImageView点击手势识别如果用户或其他地方的屏幕UIScrollView的委托上刷卡上下运行选择器(这种情况)
  • 执行它的魔力(这也恰好)
  • 如果用户启动刷卡(滚动)从UIImageView的,该事件被传递给UIScrollView的(这不会发生)

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

回答

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 

创建的ImageView:

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]; 

如果你会尝试它,你可以看到这个解决方案的工作,但不总是:)。但我相信它可以帮助你。

+0

这会使图像视图无法点击。 –

+0

我更新了我的答案 – stosha

+0

与上面的解决方案一样,从我的测试看来,这只有在UIImage是UIScrollView的子视图时才有效。我试图避免这一点,但我想这似乎是不可避免的。 – Aron

2

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

+0

这似乎是最好的解决方案。但不应该这个工作(它不是因为某种原因)?它确实没问题,scrollView不是imageLogo的超级视图吗? UITapGestureRecognizer * tapLogo = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnLogo :)]; [tapLogo requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer]; [self.imageLogo addGestureRecognizer:tapLogo]; – Aron

+0

@Aron嗯,也许这是不可能的,如果视图不是滚动视图的子视图。但为什么不把它添加到层次结构中呢?即使滚动滚动视图,您也可以轻松地将其锁定到位。 –

+0

是的,我想我会这样做,因为我发现没有办法解决层次结构问题。我想避免移动对象,假设数学很容易,它会有性能影响。我们拭目以待... – Aron

相关问题