Gesture recogniser on UILabel, not working

蓝咒 提交于 2019-12-11 22:01:37

问题


I am trying to apply UITapGestureRecognizer on a UILabel in order to check and open e-mail service. The current UIView is a part of a UIViewController and displayed once user tap on a button.

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@class AddressBook;

@interface ContactInfoUI : UIView <MFMailComposeViewControllerDelegate, UIGestureRecognizerDelegate>{

    IBOutlet UIView *view;
    UIViewController *mContainerVc;
    AddressBook *mAddressBook;
}

@property (nonatomic, retain)UIView *view;
@property (nonatomic, retain)UIViewController *mContainerVc;
@property (nonatomic, retain)AddressBook *mAddressBook;

-(void)addContactInformationFrom:(AddressBook *)addressBook;

@end

.m

@implementation ContactInfoUI

@synthesize view;
@synthesize mContainerVc;
@synthesize mAddressBook;

- (id)init {
    self = [super init];
    if (self) {
        [[NSBundle mainBundle] loadNibNamed:@"ContactInfoView" owner:self options:nil];
        self.userInteractionEnabled = YES;
        [self addSubview:[self view]];
    }
    return self;
}

-(void)addContactInformationFrom:(AddressBook *)addressBook{

    self.mAddressBook = addressBook;
    int y = 20;
    CGRect rect = CGRectMake(20, y, 320, 60);

    if (![mAddressBook.aEmail isEqualToString:@"-"]) {
        UILabel *email = [[UILabel alloc] initWithFrame:rect];

        UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showEmailForm:)];
        tgr.delegate = self;
        tgr.numberOfTapsRequired = 1;
        [email addGestureRecognizer:tgr];
        email.userInteractionEnabled = YES;

        email.text = mAddressBook.aEmail;
        [self addSubview:email];
        rect.origin.y += 40;
    }
}

-(IBAction)showEmailForm:(id)sender{

    // Email Subject
    NSString *emailTitle = @"Test Email";
    // Email Content
    NSString *messageBody = @"Some message";
    // To address
    NSArray *toRecipents = [NSArray arrayWithObject:@"test@apple.com"];

    MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
    mc.mailComposeDelegate = self;
    [mc setSubject:emailTitle];
    [mc setMessageBody:messageBody isHTML:NO];
    [mc setToRecipients:toRecipents];

    [mContainerVc presentViewController:mc animated:YES completion:NULL];
}

@end

VC.h (part)

@class ContactInfoUI;
@class ElementObject;

@interface ElementDetailsViewController : UIViewController{

    ElementObject *element;
    IBOutlet ContactInfoUI *infoView;
}

@property(nonatomic, retain) ContactInfoUI *infoView;

- (IBAction)showInfo:(id)sender;

@end

VC.m (part)

- (IBAction)showInfo:(id)sender {

    if (infoView == nil) {
        infoView  = [[ContactInfoUI alloc] init];
        infoView.userInteractionEnabled = YES;
        infoView.mContainerVc = self;
    }


    AddressBook *ab = element.getElementAddressBook;

    [infoView addContactInformationFrom:ab];
    [self.view addSubview:infoView];

    infoBtn.selected = YES;
    sumBtn.selected = NO;
    mapBtn.selected = NO;

    infoView.hidden = NO;
    staticMapScrView.hidden = YES;
    summaryView.hidden = YES;

}

The problem is that, even if I can see the actual UILabel on screen, I can't tap on it and the email function never fired.


回答1:


I'm glad you figured it. Yeah, if a UI element is smaller than any of the its superviews (all the way up the chain), all UI interaction to that element will be blocked. This goes for labels, buttons, etc..



来源:https://stackoverflow.com/questions/17957507/gesture-recogniser-on-uilabel-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!