如何自定义FBLoginVIew?

ozb*_*zba 34 facebook objective-c ios facebook-login facebook-ios-sdk

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

它显示了一个不错的FB登录按钮,但我想使用我自己的图像和文本作为登录按钮.问题是我没有看到任何地方如何定制它.

我已经设法通过覆盖FacebookSDKResources.bundle/FBLoginView/images中的图像来更改登录按钮背景图像,但我无法找到更改登录按钮文本和位置的位置,因此它保持"登录"...

解决方案,任何人

谢谢

ozb*_*zba 67

答案是遍历FBLoginView子视图,找到按钮和标签并自定义它们.

这是代码:

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];
Run Code Online (Sandbox Code Playgroud)

  • 您不需要直接使用FBLoginView.只需执行您自己的按钮,并在touchUpInside事件中使用sendActionForControlEvents来触发单击FBLoginView按钮. (7认同)

dre*_*der 9

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

首先我添加了FBLoginView作为属性:

@property (nonatomic, strong) FBLoginView* loginView;
Run Code Online (Sandbox Code Playgroud)

然后我在视图外添加了登录视图:

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

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

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

然后我将栏按钮设置为触发FBLoginView的单击操作;)

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


小智 8

当我写这篇文章时,Facebook已经发布了适用于iOS的SDK 3.0版本.

ozba的答案是有效的,但从我看来,它不应该被使用.

  • 首先,最重要的是,一般规则是迭代SDK组件的子视图/超级视图是不好的做法,因为层次结构可能在SDK版本之间发生变化,导致难以跟踪的错误,然后进行修复.
  • 其次,当点击按钮一两秒钟时,它会回到原始文本.

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

  • 它仍然留下文本定位错误的问题.它仍然是SDK中的一个变化,如果sdk有一天更新,它将被覆盖 (2认同)

Dam*_*ito 6

或者阅读Facebook的文档来构建自己的按钮:

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];


             }];

         }
     }];

}
Run Code Online (Sandbox Code Playgroud)