[英]Passing events to another object in iOS Objective C
我有一个全屏UIScrollView,它基于当前滚动位置执行自定义操作。 在位于其上方但不在同一层次结构中的一层上,我有一个UIImageView,该UIImageView带有一个轻击手势识别器,可将控制发送给给定的选择器。
我的目标是:
我知道,如果UIImageView是UIScrollView的子视图,则可以实现,但是我想避免这种情况,因为UIImageView并不是要滚动UIScrollView的内容。 无论如何,我可以将“滚动”触摸事件从UIImageView传递到UIScrollView对象,而又不使其成为滚动视图的子视图吗?
您可以使用requireGestureRecognizerToFail:
在图像视图上点击手势识别器以传递滚动视图的平移手势识别器。 仅当滚动视图的手势识别器不接受事件时,才应激活轻击手势识别器。
我想提出以下解决方案。
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];
如果您尝试一下,可以看到该解决方案有效,但并非总是如此:)。 但我相信它可以为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.