UIImageView添加UITapGestureRecognizer后传参问题

在加之前先普及一下UIView的userInteractionEnabled属性:

属性作用

       该属性值为布尔类型,如属性本身的名称所释,该属性决定UIView是否接受并响应用户的交互。

       当值设置为NO后,UIView会忽略那些原本应该发生在其自身的诸如touch和keyboard等用户事件,并将这些事件从消息队列中移除出去。当值设置为YES后,这些用户事件会正常的派发至UIView本身(前提事件确实发生在该view上),UIView会按照之前注册的事件处理方法来响应这些事件。

       在一次动画执行流程中,动画包含的所有UIView都会被临时禁止用户交互,而不管每个UIView本身userInteractionEnabled此时的属性值是YES还是NO。但是在配置动画时,通过添加UIViewAnimationOptionAllowUserInteraction选项可以禁止这种行为的发生,使UIView即使是在执行动画期间依然能响应用户事件。

发挥作用的简单原理描述

       熟悉IOS消息响应链的开发者都了解Hit-Testing的基本过程,此处对此不做深究,我们可以简单的理解为在一次用户的touch交互中,是hit-test决定了Application的整个view层次结构中,到底该由哪个view去接收并处理该事件。其基本的筛选过程可以粗糙的叙述为:

  1. touch事件发生,创建UIEvent对象
  2. 按照Application的view层次结构,逐层调用每个view的hitTest:withEvent:方法,并传入该event对象,view根据hitTest:withEvent:方法和来决定touch点是否包含在自己的bounds中;
  3. 如果view的bounds包含了touch点,该view会遍历自己的subview,并调用每个subview的pointInside:withEvent:方法来进一步决定touch事件是发生在自己本身,还是自己的subview上。
  4. 重复第二,三步,并筛选出最终接受touch事件的view对象

       我们关注的是筛选过程的第3步,view调用hitTest:withEvent:方法时,会受userInteractionEnabled属性设置的影响,如果当view的该属性值设置为NO时,即使最终touch点确实包含在view的bounds中,该view也会忽略touch事件,当然userInteractionEnabled的设置只是touch筛选的条件之一,在真正的筛选过程中还包含了其他因素的考虑,因此还要参考hitTest:withEvent:的具体方法描述,但以上描述个人感觉足够我们理解userInteractionEnabled属性的基本原理。

特殊子类的覆盖

        userInteractionEnabled属性默认值为YES,但UIView的一些子类中对该属性进行了覆盖,并将其默认值设置为了NO,其中UIImageView和UILabel就是这样的类。userInteractionEnabled属性在UIImageView和UILabel的文档中都有简单的描述。在实际的界面开发过程中,我们经常用UIImageView来模拟按钮或其它可以响应用户touch事件的显示区,并通过gesture来为其添加事件响应,因此为了保证事件能正常的接受,我们必须要显示的将UIImageView对象的userInteractionEnabled的值设为YES 。

for (int i = 0; i < 5; i++) {
                
                EGOImageView *imageView = [[EGOImageView alloc]initWithFrame:CGRectMake(i * WIDTH, 0, 320, 140)];
                
                News *model = [self.imgURLArray objectAtIndex:i];
                
                //注意,使imageView响应用户点击事件
                imageView.userInteractionEnabled = YES;
                
                imageView.imageURL = [NSURL URLWithString:model.bt];
                
                imageView.tag = i;
                
                [self.sc addSubview:imageView];
                
                UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
                
                //注意加的顺序和方式
                [imageView addGestureRecognizer:tap];
               

               //如果用tap.view.tag的设置,记得在addGestureRecognizer:后再设置。
            }

//手势响应方法

- (void)tapAction:(id *)sender
{
    NextViewController *next = [[NextViewController alloc] init];
    
    //用tag传值判断
    UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender;
    
    UIView *view = (UIView *)tap.view;
    
    NSInteger index = view.tag;
    
    NSLog(@"点击了第%zi张图片",view.tag);
    
    News *service =[self.imgURLArray objectAtIndex:index];
    
    next.news = service;
    
    [self.navigationController pushViewController:next animated:YES];
    
}



你可能感兴趣的:(iOS开发笔记,iOS,iPhone开发,uiimageview)