2013-04-23 1 views
3

Я использую XCode 4.5.1.UITapGestureRecognizer не запускается на UIImageView, созданный программно

Я добавил <UIGestureRecognizerDelegate> в файл .h и в начале .m файл

@interface FirstViewController() 

@property (nonatomic, strong) UIImageView *img1; 

@end 

Тогда в viewDidLoad, создавая UIImageView программно как

self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, -30, 44, 44)]; 
[self.img1 setImage:[UIImage imageNamed:@"image1.png"]]; 
[self.img1 setAlpha:0.8]; 
[self.img1 setHidden:NO]; 
[self.img1 setUserInteractionEnabled:YES]; 
[self.img1 setTag:901]; 

А потом

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)]; 
tap.numberOfTapsRequired = 1; 
tap.numberOfTouchesRequired = 1; 
tap.delegate = self; 

[self.img1 addGestureRecognizer:tap]; 

[self.view addSubview:self.img1]; 
[self.view bringSubviewToFront:self.img1]; 

и в конце

- (void)guessTapObject:(UITapGestureRecognizer *) gesture 
{ 
    // guessing the image 
    UIImageView *tapImageView = (UIImageView*) gesture.view; 
    NSLog(@"Gesture Tag: %d", tapImageView.tag); 
} 

У меня есть 4 разных изображения и их создание программно, как описано выше. И применение анимации для перемещения их сверху вниз.

Я хочу, чтобы при нажатии пользователем на изображении он должен анимироваться и исчезать (я знаю этот код). Но код не вызывает событие переключения. Я положил точку останова на начало функции guessTapObject, но не уходил туда никогда.

В объявлении UITapGestureRecognizer, отладка показывает, что guessTapObject прикреплен к распознавателю для выполнения действия крана.

Пожалуйста, помогите, почему событие нажатия не запускает его селекторный метод ???

Спасибо за вашу помощь заранее.


Отредактировано: я также попытался с для цикла, чтобы иметь жест распознаватель отдельно для каждого ImageView

for (UIView * view in self.view.subviews) { 
    if (view.tag > 900){ 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)]; 
     tap.numberOfTapsRequired = 1; 
     tap.numberOfTouchesRequired = 1; 
    // tap.delegate = self; 
     [view addGestureRecognizer:tap]; 
     NSLog(@"tapView: %@", tap.view); 
     NSLog(@"tap: %i", tap.enabled); 
    } 
} 
+0

Я пробовал код, который вы отправили, и он отлично работает для меня. Я получаю обратный вызов. Если вы используете несколько изображений, вам нужно создать другой UITapGestureRecognizer. Для одного изображения код должен работать нормально, пожалуйста, проверьте, нет ли ничего, или код генерации не вызван или что-то еще. – Amit

+0

Это работает, убедитесь, что изображение вы нажимаете, когда вы устанавливаете его на -30, проверьте это. –

+0

@ amit3117 .... Я попытался использовать for loop, чтобы добавить отдельный gesturerecognizer для каждого изображения, но не работает с моей стороны. – eagle

ответ

0

Я решил применить жест на вид, а не каждый вид изображения отдельно.

[self.view addGestureRecognizer:tap];

, а затем в обработчике/селектор guessTapObject функции, я использовал это

CGPoint tapLocation = [gesture locationInView:self.view]; // gives the tap coordinates 
for (UIView * view in self.view.subviews) { // gives view by iterating on each subview 
    CGRect dropRect = [[[view layer] presentationLayer] frame]; // specific way of getting the frame with respect to its layer 

    if(CGRectContainsPoint(dropRect, tapLocation)){ // checks for tap in the boundaries of view frame 
     if (view.tag > 900) // my specific view 
      // done what i want to do with that specific one 
      // as i removed it from my superview 
     } 
    } 
} 
2

Проверить эту
Добавить следующий код в View Controller

  • In viewCo ntroller.h файл

    @property (nonatomic, strong) UIImageView *img1; 
    @property (nonatomic, strong) UIImageView *img2; 
    @property (nonatomic, strong) UIImageView *img3; 
    
  • В viewController.m файл
    Внутри viewDidLoad Метод

    // Init Image 1 
    self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 30, 44, 44)]; 
    [self.img1 setImage:[UIImage imageNamed:@"image1_name.jpg"]]; 
    [self.img1 setAlpha:0.8]; 
    [self.img1 setHidden:NO]; 
    [self.img1 setUserInteractionEnabled:YES]; 
    [self.img1 setTag:901]; 
    
    // Init Image 2 
    self.img2 = [[UIImageView alloc] initWithFrame:CGRectMake(100, 30, 44, 44)]; 
    [self.img2 setImage:[UIImage imageNamed:@"image2_name.jpg"]]; 
    [self.img2 setAlpha:0.8]; 
    [self.img2 setHidden:NO]; 
    [self.img2 setUserInteractionEnabled:YES]; 
    [self.img2 setTag:902]; 
    
    // Init Image 3 
    self.img3 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 130, 44, 44)]; 
    [self.img3 setImage:[UIImage imageNamed:@"image3_name.jpg"]]; 
    [self.img3 setAlpha:0.8]; 
    [self.img3 setHidden:NO]; 
    [self.img3 setUserInteractionEnabled:YES]; 
    [self.img3 setTag:903]; 
    
    // Add Images to view 
    [self.view addSubview:self.img1]; 
    [self.view bringSubviewToFront:self.img1]; 
    
    [self.view addSubview:self.img2]; 
    [self.view bringSubviewToFront:self.img2]; 
    
    [self.view addSubview:self.img3]; 
    [self.view bringSubviewToFront:self.img3]; 
    
    // Set Tap Gesture to each image of view 
    for (UIView * view in self.view.subviews) { 
        if (view.tag > 900){ 
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                 initWithTarget:self 
                 action:@selector(guessTapObject:)]; 
        tap.numberOfTapsRequired = 1; 
        tap.numberOfTouchesRequired = 1; 
        [view addGestureRecognizer:tap]; 
        NSLog(@"tapView: %@", tap.view); 
        NSLog(@"tap: %i", tap.enabled); 
        } 
    } 
    


Убедитесь, что изображения должны быть добавлены перед цикл (добавление TapGesture с использованием массива subview)

5

я застрял в подобной проблеме .. Убедитесь, что ImageView установлен верно для userInteraction ..

imageView.userInteractionEnabled = YES; 

Это сработало для меня!

 Смежные вопросы

  • Нет связанных вопросов^_^