UITapGestureRecognizer 在 iPad 上触发,但在 iPhone 上不触发,但代码相同

Posted

技术标签:

【中文标题】UITapGestureRecognizer 在 iPad 上触发,但在 iPhone 上不触发,但代码相同【英文标题】:UITapGestureRecognizer fires on iPad but not on iPhone, but it is the same code 【发布时间】:2013-03-11 20:07:54 【问题描述】:

我有一个不应该的小问题...... 我正在为 ios 制作一个通用应用程序,但我遇到了在 iPad 上触发但在 iPhone 上没有触发的 UITapGestureRecognizer 问题。

更新开始

我在 iPhone 上强制使用 iPad 笔尖,它可以工作!所以我的 iPhone nib 文件有问题,因为两个 nib 都只包含一个 UIView 和 UIScrollView,所以使用代码放置其他任何东西可能是错误的......

更新结束

为 UIView 子类添加了我的识别器:

h 文件:

#import <UIKit/UIKit.h>

@interface POI : UIView <UIGestureRecognizerDelegate>
    UIImageView *pointBgView;
    float tipHeight;
    float tipWidth;

-(id)initWithPointBg:(NSString *)pointBgURL andFrame:(CGRect)frame;
@property (nonatomic) float tipHeight;
@property (nonatomic) float tipWidth;
@end

m 文件:

#import "POI.h"
#import <QuartzCore/QuartzCore.h>

@implementation POI

@synthesize tipHeight,tipWidth;

-(id)initWithPointBg:(NSString *)pointBgURL andFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        UITapGestureRecognizer *tapRecognizer =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(respondToTap:)];
        // Specify that the gesture must be a single tap
        tapRecognizer.numberOfTapsRequired = 1;
        [tapRecognizer setDelegate:self];
        // Add the tap gesture recognizer to the view
        [self addGestureRecognizer:tapRecognizer];

        pointBgView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:pointBgURL]];
        pointBgView.layer.shadowColor = [[UIColor blackColor] CGColor];
        pointBgView.layer.shadowOpacity = 0.7;
        pointBgView.layer.shadowRadius = 4.0;
        pointBgView.clipsToBounds = NO;
        pointBgView.userInteractionEnabled = YES;

        pointBgView.layer.shadowOffset = CGSizeMake(0, 0);
        pointBgView.layer.shadowPath = [UIBezierPath bezierPathWithRect:pointBgView.bounds].CGPath;

        [pointBgView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
        [pointBgView.layer setBorderWidth: 2.0];



        [self addSubview:pointBgView];
        [self setBackgroundColor:[UIColor clearColor]];
        self.tipHeight = 30;
        self.tipWidth = 50;



    
    return self;



- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

    NSLog(@"TAP");
    return YES;


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    NSLog(@"StartTap");
    return YES;


-(void)respondToTap:(UITapGestureRecognizer *)recognizer

    NSLog(@"UITAP");
    [[NSNotificationCenter defaultCenter]
 postNotificationName:@"POITap"
 object:self];


以上是有问题的代码...

在 iPad 上进行测试时会触发所有 NSLog,但在 iPhone(无论是否为模拟器)上不会触发。

所以:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

没有开火……

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    NSLog(@"StartTap");
    return YES;

没有开火……

-(void)respondToTap:(UITapGestureRecognizer *)recognizer

    NSLog(@"UITAP");
    [[NSNotificationCenter defaultCenter]
 postNotificationName:@"POITap"
 object:self];


...没有开火!?

我必须说,这个应用程序使用了两个单独的 nib(显然一个用于 iPad,另一个用于 iPhone),并且它们所包含的内容完全相同......

我添加了代理,因为它不能在 iPhone 上运行,所以我想看看它是否有帮助,没有运气......

究竟是什么原因导致了这种行为?

感谢您能给我带来的任何帮助和平安:)

干杯!

【问题讨论】:

您确定在两个 nib 中都指定了 UIView 子类吗? 要检查的内容:视图上的 userInteractionEnabled = YES。视图的边界在父视图的范围内。 @JesseRusak,在笔尖中我有一个包含滚动视图的 uiView。然后通过代码,我添加了一个子视图(在滚动视图中),它扩展了 uiView,我添加了上面类的实例(POI)。简而言之,我在 nib 文件中只有两件事要连接,并且两者都在工作(我的意思是滚动视图) @jsd,是的,我确实检查了这个,它设置为 YES,所以它一定是别的东西......我真的很困惑...... 【参考方案1】:

看起来这是 UIScrollView 的问题,即使在 iPad 上,如果在滚动视图出现时它不可见(在 UIScrollView 的可见框架之外),我将无法点击 imageView。

至少我知道我没疯:)

谢谢

【讨论】:

以上是关于UITapGestureRecognizer 在 iPad 上触发,但在 iPhone 上不触发,但代码相同的主要内容,如果未能解决你的问题,请参考以下文章

在 UITapGestureRecognizer 上添加参数

在 UITapGestureRecognizer 中更改字体

使用 UITapGestureRecognizer 无法识别的选择器

带有点击事件的 UITapGestureRecognizer

UITapGestureRecognizer 和 touchesBegan 用于相同的视图

UIButton 上的 UITapGestureRecognizer