Question

I want to show a HUD when somebody press the facebook login button. Currently I struggle to know when the button was pressed.

I tried to grab all taps of the view, but this does not work for any reson on the facebook button...

How can know when the facebook login is pressed, to call my HUD?

Additional it would be nice to know which function the facebook login button triggers. Could not find out..

Code to grab taps, in LoginViewController.m (UPDATED, working solution)

// workaround to find out when user tapped the login button
-(void)addTapFinder {
    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];

    tapped.numberOfTapsRequired = 1;
    tapped.delegate = self;
    tapped.cancelsTouchesInView = NO;

    FBLoginView *fbButton = [[FBLoginView alloc] init];
    UIView * fbView = (UIView *)fbButton;
    fbView = [self.view viewWithTag:fbloginViewTAG];

    [fbView addGestureRecognizer:tapped];

    DLog(@"found View %@", fbView);
}


-(void)tapped {
    DLog(@"tapped");
}

Debugger log

[872:60b] -[LoginViewController FacebookLogin] [Line 283] loginview subviews: <FBShadowLabel: 0x16d17840; baseClass = UILabel; frame = (33 -1; 168 46); text = 'Connect  Facebook'; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x18136240>>
[872:60b] -[LoginViewController showFBLogin] [Line 231] show login View
[872:60b] -[LoginViewController tapped] [Line 250] tapped   // tapped somewhere in self.view, but not the login button
// tapped the login button, no "tapped" entry in the logfile

Below the complete code:

LoginViewController.h

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
#import "WebApi.h"
#import "SVProgressHUD.h"

@interface LoginViewController : UIViewController <FBLoginViewDelegate, UIGestureRecognizerDelegate>

-(IBAction)toSurroundView;

@property (nonatomic, strong) WebApi *swebapi;
@property (nonatomic) BOOL isFirstFBLoginDone;
@property (weak, nonatomic) IBOutlet UIView *loginView;

@end

LoginViewController.m

#import "LoginViewController.h"

@interface LoginViewController ()
@end

@implementation LoginViewController


static int const fbloginViewTAG = 203;

-(void)vinit {
    self.swebapi = [[WebApi alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"didRegisterUser" object:nil ];
    self.isFirstFBLoginDone = FALSE;
}

- (void)viewDidLoad
{
    [self vinit];
    [super viewDidLoad];
    [self showFBLogin];
}


-(void)handleNotification:(NSNotification *)message {
    if ([[message name] isEqualToString:@"didRegisterUser"]) {
        [self toSurroundView];
    }
}

-(IBAction)toSurroundView {
    [SVProgressHUD dismiss]; // connecting to Facebook, this is called to late!

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *surroundViewController = [mainStoryboard instantiateInitialViewController];
    surroundViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:surroundViewController animated:YES completion:nil];
}

#pragma mark - Facebook Things

-(void)showFBLogin {
    UIView *connectView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:connectView];
    [self FacebookLogin];   
    [self addTapFinder]; 
    DLog(@"show login View");
}

// workaround to find out when user tapped the login button
-(void)addTapFinder {
    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];

    tapped.numberOfTapsRequired = 1;
    tapped.delegate = self;
    tapped.cancelsTouchesInView = NO;

    FBLoginView *fbButton = [[FBLoginView alloc] init];
    UIView * fbView = (UIView *)fbButton;
    fbView = [self.view viewWithTag:fbloginViewTAG];

    [fbView addGestureRecognizer:tapped];

    DLog(@"found View %@", fbView);
}

-(void)tapped {
    DLog(@"tapped");
}

-(void)FacebookLogin {

    // https://developers.facebook.com/docs/ios/login-ui-control/
    // https://developers.facebook.com/docs/ios/session/

    FBLoginView *loginView = [[FBLoginView alloc] init];
    loginView.delegate = self;
    loginView.tag = fbloginViewTAG;
    loginView.readPermissions = @[@"email", @"basic_info"];
    loginView.frame = CGRectOffset(loginView.frame,
                                   (self.view.center.x - (loginView.frame.size.width / 2)),
                                   ([[UIScreen mainScreen] bounds].size.height - 80));

    // change fb login button text
    UILabel *fblabel = [loginView subviews][1];
    fblabel.text = @"Connect  Facebook";

    DLog(@"loginview subviews: %@", [loginView subviews][1]);

    [self.view addSubview:loginView];
    [loginView sizeToFit];

}

- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                            user:(id<FBGraphUser>)user {

    [SVProgressHUD showWithStatus:@"Connecting with Facebook"];
    if (! self.isFirstFBLoginDone) {
    #warning simple workaround, but not solving the source problem of twiced call from loginViewFetchedUserInfo
        if ([[SingletonClass sharedInstance] hasCredentials] == NO) {
            [self.swebapi registerUser:user];
        } else {
            [self toSurroundView];
        }

        self.isFirstFBLoginDone = TRUE;

    } // isFirstFBLoginDone
}
@end
Was it helpful?

Solution

A few things that may be causing problems in your code --

  1. Set the UIGestureRecognizer's delegate in order to force the recognition of multiple gesture recognizers, specifically the simultaneous recognition of this new gesture recognizer alongside the Facebook login button's gesture recognizer) using: gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer

  2. Set your UIGestureRecognizer's cancelsTouchesInView property to NO.

  3. Instead of initializing your the pointer to the fbButton as a UIView, you should declare fbButton as a FBLoginView and cast the UIView into a FBLoginView.

  4. (Most importantly) You're adding the UITapGestureRecognizer to the view when you should be adding it to the button.

Change:

[self.view addGestureRecognizer:tapped];

to:

[fbButton addGestureRecognizer:tapped];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top