我想在有人按下 facebook 登录按钮时显示一个 HUD。目前我很难知道什么时候按下了按钮。
我试图捕获 View 的所有点击,但这对 facebook 按钮上的任何共鸣都不起作用......
如何知道何时按下 facebook 登录,调用我的 HUD?
另外,如果知道 facebook 登录按钮触发哪个功能会更好。找不到..
在 LoginViewController.m 中获取水龙头的代码(已更新,可行的解决方案)
// 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");
}
调试器日志
[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
完整代码如下:
登录 View Controller .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
登录 View Controller .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
最佳答案
一些可能导致您的代码出现问题的事情 --
设置
UIGestureRecognizer
的委托(delegate)以强制识别多个手势识别器,特别是同时识别这个新的手势识别器和 Facebook 登录按钮的手势识别器)使用:gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer
将您的
UIGestureRecognizer
的cancelsTouchesInView
属性设置为 NO。与其将指向
fbButton
的指针初始化为UIView
,不如将fbButton
声明为FBLoginView
并将UIView
转换为FBLoginView
。(最重要的是)当您应该将
UITapGestureRecognizer
添加到按钮时,您将其添加到 View 。
改变:
[self.view addGestureRecognizer:tapped];
到:
[fbButton addGestureRecognizer:tapped];
关于ios - 知道何时在 ios 中按下 facebook 登录按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883536/