如何定制FBLoginVIew?

为了连接到我的ios应用程序中的Facebook,我使用Facebook SDK for iOS的 FBLoginVIew。

它显示了一个不错的FBloginbutton,但我想使用我自己的图像和文本的loginbutton。 问题是,我没有看到任何地方如何定制。

我已经设法通过覆盖FacebookSDKResources.bundle / FBLoginView /图像中的图像来更改loginbutton的背景图像,但我找不到在哪里更改loginbutton的文本和位置,所以它保持“login”…

解决scheme,有人吗

谢谢

答案是通过FBLoginView子视图,findbutton和标签,并定制它们。

这里是代码:

FBLoginView *loginview = [[FBLoginView alloc] initWithPermissions:[NSArray arrayWithObject:@"publish_actions"]]; loginview.frame = CGRectMake(4, 95, 271, 37); for (id obj in loginview.subviews) { if ([obj isKindOfClass:[UIButton class]]) { UIButton * loginButton = obj; UIImage *loginImage = [UIImage imageNamed:@"YourImg.png"]; [loginButton setBackgroundImage:loginImage forState:UIControlStateNormal]; [loginButton setBackgroundImage:nil forState:UIControlStateSelected]; [loginButton setBackgroundImage:nil forState:UIControlStateHighlighted]; [loginButton sizeToFit]; } if ([obj isKindOfClass:[UILabel class]]) { UILabel * loginLabel = obj; loginLabel.text = @"Log in to facebook"; loginLabel.textAlignment = UITextAlignmentCenter; loginLabel.frame = CGRectMake(0, 0, 271, 37); } } loginview.delegate = self; [self.view addSubview:loginview]; 

我想成为一个UIBarbutton的FBLoginview显示,所以我做了一个简单的方法:

首先我已经添加了FBLoginView作为一个属性:

 @property (nonatomic, strong) FBLoginView* loginView; 

然后我在视图之外添加了login视图:

  self.loginView = [[FBLoginView alloc] init]; self.loginView.frame = CGRectMake(-500, -500, 0, 0); [self.view addSubview:self.loginView]; self.loginView.delegate = self; 

然后,我添加了一个标准的系统UIbarbuttonItem

  UIBarButtonItem* fbButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(fireFbLoginView)]; [self.navigationItem setRightBarButtonItem:fbButton]; 

然后我设置栏button来触发FBLoginView的点击动作;)

 -(void)fireFbLoginView{ for(id object in self.loginView.subviews){ if([[object class] isSubclassOfClass:[UIButton class]]){ UIButton* button = (UIButton*)object; [button sendActionsForControlEvents:UIControlEventTouchUpInside]; } } } 

当我写这篇文章的时候,Facebook已经发布了iOS版本的SDK 3.0版本。

ozba的答案是有点工作,但从我的意见来说,它不应该被使用。

  • 首先,最重要的是,一般来说,遍历SDK组件的子视图/超级视图是不好的做法,因为层次结构可能会在SDK版本之间发生变化 ,从而导致难以跟踪和修复的错误。
  • 其次,当button被点击,一两秒钟,它就会回到原来的文字。

我的解决scheme非常简单。 在Facebook下载的文件夹FacebookSDK中 ,您有一个名为Samples的文件夹。 在那里,你必须看看SessionLoginSample 。 你可以看到他们有一个普通的Round Rect Button ,它通过拥有它的ViewController拥有FBLoginViewDelegate ,它可以根据FBSession状态改变文本。 相信我,这很简单。

或阅读Facebook的文档来build立自己的button:

https://developers.facebook.com/docs/ios/login-tutorial/#login-apicalls

喜欢这个:

 - (void) buttonSelector { [FBSession openActiveSessionWithReadPermissions:@[@"basic_info"] allowLoginUI:YES completionHandler: ^(FBSession *session, FBSessionState state, NSError *error) { if (FBSession.activeSession.state == FBSessionStateOpen) { //To get the use [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection,NSDictionary<FBGraphUser> *user, NSError *error) { NSString *token = [[[FBSession activeSession] accessTokenData] accessToken]; }]; } }]; } 

改变Facebook资源包中的文本en.lproj Localizable.strings …我想它的工作原理

我正在创build一个自定义的FBbutton类,以防其他项目需要回收它,它仍然是第一个版本,但工作,根据logging的状态更改button图像,并轻松pipe理其大小。

有些方法是为了即时的。

注意,您也可以通过将其类设置为FBCustomLoginView及其委托来放置NIB文件中的button视图,但无论您设置了多less大小,都将始终重置为FBLoginView的默认大小,因此您必须始终使用代码设置特定的大小。 (我不知道如何从NSCoder获取帧的大小以避免这种情况)

代码是AS-IS,你可以编辑它,并负责其中的任何错误,我会编辑这个答案,因为我发现任何。 我希望对某人有用。

如果你从NIB添加它,你只需调整它与所需的文本和图像,其余的作品,如果它是一个FBLoginView:

  _facebookLoginButton.label.text = nil; [_facebookLoginButton setLoggedImage: [UIImage imageNamed: @"ic_link_fb_on.png"] notLoggedImage: [UIImage imageNamed: @"ic_link_fb_off.png"]]; [_facebookLoginButton wrapButtonToSizeWidth: IS_IPAD ? 38 : 30 height: IS_IPAD ? 38 : 30 ]; 

FBCustomLoginView.h

 #import <Foundation/Foundation.h> #import <FacebookSDK/FacebookSDK.h> @interface FBCustomLoginView : FBLoginView <FBLoginViewDelegate> /** The button actual button */ @property (nonatomic, strong) UIButton* button; /** The button label */ @property (nonatomic, strong) UILabel* label; /** To a single button without label, set the same frame for the login button view and the actual button */ - (void)setWrappedButtonFrame:(CGRect)frame; /** Wraps button to specified size, maintaining frame origin */ - (void)wrapButtonToSizeWidth: (CGFloat) width height: (CGFloat) height; /** Sets a default background image for all states */ - (void) setBackgroundImage: (UIImage*) image selectedImage: (UIImage*) selectedImage highlightedImage: (UIImage*) highlightedImage disabledImage: (UIImage*) disabledImage; /** Sets a default background image */ - (void) setBackgroundImage: (UIImage*) image; /** Resizes the background image to specified size */ - (void) setBackgroundImageSizeWidth: (CGFloat) width height: (CGFloat) height; /** Place images to manage and differentiate between logged in and out states */ - (void) setLoggedImage: (UIImage*) loggedImage notLoggedImage: (UIImage*) notLoggedImage; @end 

FBCustomLoginView.m

 #import "FBCustomLoginView.h" @interface FBCustomLoginView() { id<FBLoginViewDelegate> _delegate; UIImage* _loggedImage; UIImage* _notLoggedImage; } @end @implementation FBCustomLoginView @synthesize button = _button; @synthesize label = _label; #pragma mark - View lifecycle, superclass override - (id)init { if (self = [super init]) { [self getReferences]; } return self; } - (id)initWithFrame:(CGRect)frame { if(self = [super initWithFrame: frame]) { [self getReferences]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder: aDecoder]) { [self getReferences]; } return self; } - (void) getReferences { for (id obj in self.subviews) { if ([obj isKindOfClass:[UIButton class]]) { self.button = obj; } if ([obj isKindOfClass:[UILabel class]]) { self.label = obj; } } } - (void)setDelegate:(id<FBLoginViewDelegate>)delegate { _delegate = delegate; [super setDelegate: self]; } #pragma mark - FBLoginViewDelegate - (void)loginViewShowingLoggedInUser:(FBLoginView *)loginView { if (_loggedImage) { [self setBackgroundImage: _loggedImage]; } [_delegate loginViewShowingLoggedInUser: loginView]; } - (void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user { [_delegate loginViewFetchedUserInfo: loginView user: user]; } - (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView { if (_notLoggedImage) { [self setBackgroundImage: _notLoggedImage]; } [_delegate loginViewShowingLoggedOutUser: loginView]; } - (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error { if ([_delegate respondsToSelector: @selector(loginView:handleError:)]) { [_delegate performSelector: @selector(loginView:handleError:) withObject: loginView withObject: error]; } } #pragma mark - Custom methods /** To a single button without label, set the same frame for the login button view and the actual button */ - (void)setWrappedButtonFrame:(CGRect)frame { [super setFrame: frame]; if (_button) { [self setBackgroundImageSizeWidth: frame.size.width height: frame.size.height]; } } /** Wraps button to specified size, maintaining frame origin */ - (void)wrapButtonToSizeWidth: (CGFloat) width height: (CGFloat) height { [super setFrame: CGRectMake(self.frame.origin.x, self.frame.origin.y, width, height)]; if (_button) { [self setBackgroundImageSizeWidth: width height: height]; } } - (void) setBackgroundImage: (UIImage*) image selectedImage: (UIImage*) selectedImage highlightedImage: (UIImage*) highlightedImage disabledImage: (UIImage*) disabledImage { [_button setBackgroundImage:image forState:UIControlStateNormal]; [_button setBackgroundImage:selectedImage forState:UIControlStateSelected]; [_button setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; [_button setBackgroundImage:disabledImage forState:UIControlStateDisabled]; } - (void) setBackgroundImage: (UIImage*) image { [self setBackgroundImage: image selectedImage:nil highlightedImage:nil disabledImage:nil]; } - (void) setBackgroundImageSizeWidth: (CGFloat) width height: (CGFloat) height { _button.frame = CGRectMake(0, 0, width, height); } - (void) setLoggedImage: (UIImage*) loggedImage notLoggedImage: (UIImage*) notLoggedImage { _loggedImage = loggedImage; _notLoggedImage = notLoggedImage; [self setBackgroundImage: notLoggedImage]; } @end 

我想我发现了一个更简单的方法来定制文本,例如,一个FBSDKLoginButton的文本,而不必从头创build一个完全定制的button,其中包含所有的loginfunction。 这很好,因为FBSDKLoginButton完成所有的工作 – 你只需要改变文本。 对不起我只知道Swift …这里是代码:

 var fbButton = FBSDKLoginButton() var titleText = NSAttributedString(string: "Your new button title") fbButton.setAttributedTitle(titleText, forState: UIControlState.Normal) 

请享用!

你所有问题的答案,包括login后按下的标签是非常简单的:这就像OZBA答案刚刚删除UILabel (添加: [loginLabel removeFromSuperview];

这是完整的工作代码:

 - (void)setFacebookConnectButton{ self.loginView.readPermissions = @[@"public_profile", @"email", @"user_friends"]; [self.loginView setDelegate:self]; for (id obj in self.loginView.subviews) { if ([obj isKindOfClass:[UIButton class]]) { UIButton * loginButton = obj; UIImage *loginImage = [UIImage imageNamed:@"fb_connect"]; [loginButton setBackgroundImage:loginImage forState:UIControlStateNormal]; [loginButton setBackgroundImage:nil forState:UIControlStateSelected]; [loginButton setBackgroundImage:nil forState:UIControlStateHighlighted]; [loginButton setTitle:nil forState:UIControlStateSelected]; [loginButton setTitle:nil forState:UIControlStateHighlighted]; [loginButton sizeToFit]; } if ([obj isKindOfClass:[UILabel class]]) { UILabel * loginLabel = obj; loginLabel.text = @""; loginLabel.textAlignment = NSTextAlignmentCenter; loginLabel.frame = CGRectMake(0, 0, 271, 37); [loginLabel removeFromSuperview]; } } } 

请阅读Facebook SDK中的README文件。 您必须在info.plist中添加Row – FacebookBundleName,并将其命名为您的包。 然后,用这个名字添加一个包到你的项目中,并放到名为“lang.lproj”的文件夹中:例如:en.lproj – it.lproj – fr.lproj – es.lproj ….进入这个文件夹,你必须添加Localizable.strings文件,然后你可以本地化很多短语,如:

 "FBLV:LogOutButton" = "Log Out"; "FBLV:LogInButton" = "Log In"; "FBLV:LoggedInAs" = "Logged in as: %@"; "FBLV:LoggedInUsingFacebook" = "Logged in using Facebook"; "FBLV:LogOutAction" = "Log Out"; "FBLV:CancelAction" = "Cancel"; 

希望它可以帮助你!

我刚刚find了按下loginbutton时button文本更新的答案。 我遭受了同样的问题。

尝试将button标签的框架设置为CGRectMake(0,0,0,0)。

我试了一下,我认为它的工作。

将此代码添加到ozba的答案:

 [loginLabel setFrame:CGRectMake(0, 0, 0, 0)]; 

希望这可以帮助。

我想到了这个问题,而且我本人并不是真的很喜欢这个被接受的答案。 每个人都是自由的,他喜欢的解决scheme,但我决定分享我自己的解决scheme。

 for (UIButton *view in loginView.subviews) { if ([view respondsToSelector:@selector(addTarget:action:forControlEvents:)]) { [view setBackgroundImage:nil forState:UIControlStateNormal]; [view setBackgroundImage:nil forState:UIControlStateHighlighted]; } } 

我使用了respondsToSelector而不是isKindOfClass因为这个类将来可能是自定义的。

将FB视图置于屏幕外,或大小为0x0。 然后,设置button的动作,将消息buttonPressed:发送到FB视图。 我觉得这是最简单的方法。

在我的情况下,我在Photoshop中创build了一个漂亮的button,并将其放在faceBookbutton的顶部。 (我知道,苹果不build议把button放在视图上但是迭代子视图对我来说看起来不太好)。 很难理解为什么FB这样的公司没有提供简单的方法来做到这一点。

 UIImageView *fbImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"facebookButton.png"]]; CGRect newFrame = fBButtonFrame; newFrame.origin.x = 0; newFrame.origin.y = 0; [fbImageView setFrame:newFrame]; [fbImageView setUserInteractionEnabled:NO]; FBLoginView *loginView = [[FBLoginView alloc] init]; [loginView setFrame:fBButtonFrame]; [loginView addSubview:fbImageView]; [self.view addSubview:loginView]; 

如果您参考https://github.com/facebook/facebook-ios-sdk/blob/master/src/UI/FBLoginView.m ,您会发现第299行中的文本是由FBLoginView中的实例方法提供的。 因此,您可以通过从FBLoginView派生自己的类并提供您自己的logInText实现来更改此文本:

 @interface CustomFBLoginView : FBLoginView @end @implementation CustomFBLoginView -(NSString*) logInText { return @"Some custom text"; } @end 

这有点冒险,因为它取决于内部的实现细节。

自从最新版本的4.X Facebook SDK以来,

自定义login更容易,使用FBSDKLoginManager

根据最新的Facebooklogin对于iOS版本2.3。

您可以使用下面的代码片段通过任何自定义UIButtonlogin。

 - (void)loginWithFacebook:(id) sender { FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; [login logInWithReadPermissions:@[@"public_profile",@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) { // Process error } else if (result.isCancelled) { // Handle cancellations } else { // Login Successful here // Check for any particular permissions you asked if ([result.grantedPermissions containsObject:@"email"]) { // Do work } } }]; } 

这里是链接: https : //developers.facebook.com/docs/facebook-login/ios/v2.3#login-apicalls

最简单的解决scheme

 let FB_LoginButton = FBSDKLoginButton() let imgV = UIImageView(frame: FB_LoginButton.frame) img.image = UIImage(named: "Your Image Name") let textV = UILabel(frame: CGRect(x: 0, y: 0, width: FB_LoginButton.frame.size.width, height: 20)) // Set Frames as you need textV.text = "Your Text" textV.font = textV.font.fontWithSize(20) // Swift 3 textV.font = textV.font.withSize(20) imgV.addSubview(textV) FB_LoginButton.addSubview(imgV)