今天我遇到一些奇怪的事情,同时将相同的手势识别器附加到多个图像视图。它仅附加到最后一个,换句话说,它只能附加到一个视图!
我必须创建多个手势识别器才能满足我的要求。
以下是我所做的。我做得对吗?这是将识别器附加到多个图像视图的唯一方法吗?
请注意,我不想使用UITableView或UIVIew并将所有图像视图放入其中,并仅将手势识别器附加到UITableView或UIVIew。我将所有图像分散,我必须检测正在拖动的图像。感谢。
[imgView1 setUserInteractionEnabled:YES];
[imgView1 setMultipleTouchEnabled:YES];
[imgView2 setUserInteractionEnabled:YES];
[imgView2 setMultipleTouchEnabled:YES];
[imgView3 setUserInteractionEnabled:YES];
[imgView3 setMultipleTouchEnabled:YES];
[imgView4 setUserInteractionEnabled:YES];
[imgView4 setMultipleTouchEnabled:YES];
[imgView5 setUserInteractionEnabled:YES];
[imgView5 setMultipleTouchEnabled:YES];
[imgView6 setUserInteractionEnabled:YES];
[imgView6 setMultipleTouchEnabled:YES];
//Attach gesture recognizer to each imagviews
gestureRecognizer1 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer1.delegate = self;
gestureRecognizer2 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer2.delegate = self;
gestureRecognizer3 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer3.delegate = self;
gestureRecognizer4 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer4.delegate = self;
gestureRecognizer5 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer5.delegate = self;
gestureRecognizer6 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
gestureRecognizer6.delegate = self;
[imgView1 addGestureRecognizer:gestureRecognizer1];
[imgView2 addGestureRecognizer:gestureRecognizer2];
[imgView3 addGestureRecognizer:gestureRecognizer3];
[imgView4 addGestureRecognizer:gestureRecognizer4];
[imgView5 addGestureRecognizer:gestureRecognizer5];
[imgView6 addGestureRecognizer:gestureRecognizer6];
答案 0 :(得分:2)
您无法将手势识别器附加到多个对象(如您所发现的那样)。您正在做的一个解决方案可能是子类UIImageView并在该类中设置代码,以便每个视图创建其识别器等。
答案 1 :(得分:2)
是的,每个手势识别器有一个视图。因此,如果您只想要一个识别器,请将其放在超级视图上,例如:
UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
[self.view addGestureRecognizer:gestureRecognizer];
然后,在你的处理程序中,你可以:
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender
{
CGPoint location = [sender locationInView:self.view];
if (sender.state == UIGestureRecognizerStateBegan)
{
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:[UIImageView class]] && CGRectContainsPoint(view.frame, location))
{
UIImageView *image = (UIImageView *) view;
// ok, now you know which image you received your long press for
// do whatever you wanted on it at this point
return;
}
}
}
}
顺便说一句,如果你这样做,你也不必担心在图像上启用用户交互。
最后,除非你要遵守UIGestureRecognizerDelegate
,否则你不必担心指定你的手势识别器的委托。另请注意,我正在使用本地var作为识别器,因为没有理由坚持它。
<强>更新强>
虽然上面的代码工作得很好,但是如果长按没有在图像上发生,那么自定义的长按手势识别器可能会更好(这样一来,如果你有其他的话,它更有可能发挥得很好在您的视图中发生的手势识别器)。所以:
#import <UIKit/UIGestureRecognizerSubclass.h>
@interface ImageLongPressGestureRecognizer : UILongPressGestureRecognizer
@property (nonatomic, weak) UIImageView *imageview;
@end
@implementation ImageLongPressGestureRecognizer
@synthesize imageview = _imageview;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.imageview = nil;
[super touchesBegan:touches withEvent:event];
CGPoint location = [self locationInView:self.view];
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:[UIImageView class]] && CGRectContainsPoint(view.frame, location))
{
self.imageview = (UIImageView *)view;
return;
}
}
self.state = UIGestureRecognizerStateFailed;
}
@end
然后使用这个新的子类相应地创建你的手势识别器:
ImageLongPressGestureRecognizer *gestureRecognizer = [[ImageLongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[self.view addGestureRecognizer:gestureRecognizer];
然后,作为这个子类化的一个很好的好处,你的主要手势识别器被简化,即:
- (void)handleLongPress:(ImageLongPressGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan)
{
// you can now do whatever you want with sender.imageview, e.g. this makes it blink for you:
[UIView animateWithDuration:0.5
animations:^{
sender.imageview.alpha = 0.0;
} completion:^(BOOL finished){
[UIView animateWithDuration:0.5
animations:^{
sender.imageview.alpha = 1.0;
}
completion:nil];
}];
}
}
答案 2 :(得分:0)
我想,首先,你应该创建一个视图数组和识别器数组(如果需要的话,可变数组),然后填充它。它将帮助您使用循环来避免代码重复。
对于带有一个识别器的多视图 - 不,这是不可能的,answered here。