Подтвердить что ты не робот

Как настроить FBLoginVIew?

Чтобы подключиться к facebook в моем приложении ios, я использую FBLoginVIew из Facebook SDK для iOS.

Он показывает приятную кнопку входа FB, но я хочу использовать свое собственное изображение и текст для кнопки входа. Проблема в том, что я не вижу, как это настроить.

Мне удалось изменить фоновое изображение кнопки входа в систему, переопределив изображения в FacebookSDKResources.bundle/FBLoginView/images, но я не смог найти, где изменить текст и положение кнопки входа, поэтому он остается "Войдите",...

Решение, кто-нибудь?

Спасибо

4b9b3361

Ответ 1

Ответ заключается в том, чтобы перейти к подзонам 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];

Ответ 2

Я хотел быть шоу FBLoginview как UIBarbutton, поэтому я сделал простой подход:

Сначала я добавил FBLoginView в качестве свойства:

@property (nonatomic, strong) FBLoginView* loginView;

И затем я добавил вид входа вне представления:

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

И затем я установил кнопку панели, чтобы запустить действие щелчка FBLoginView;)

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

Ответ 3

Когда я пишу это, Facebook уже выпустил версию 3.0 своего SDK для iOS.

Ответ ozba - это своего рода работа, но, по моему мнению, он не должен использоваться.

  • Во-первых, и самое главное, это общее правило, заключающееся в том, что неправильная практика выполняет итерацию через subviews/superviews компонента SDK, поскольку иерархия может изменяться между версиями SDK, вызывая ошибки, которые будут трудно отслеживать и затем ремонтировать.
  • Во-вторых, когда кнопка нажата, на секунду или два, она возвращается к исходному тексту.

Мое решение очень просто. В папке, загруженной Facebook, FacebookSDK, у вас есть папка с именем Образцы. Там вы должны посмотреть в SessionLoginSample. Вы можете видеть, что у них есть обычная кнопка Round Rect, которая через ViewController, которая ее владеет, имеет FBLoginViewDelegate, она может изменять текст в зависимости от состояния FBSession. Поверьте мне, это очень просто.

Ответ 4

Или прочитайте документацию 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];


             }];

         }
     }];

}

Ответ 5

Измените текст в пакете ресурсов Facebook en.lproj Localizable.strings... я полагаю, что он работает

Ответ 6

Я создаю пользовательский класс кнопок FB в случае, если мне нужно его переработать для других проектов. Он по-прежнему является первой версией, но работает, чтобы изменить изображение кнопки в зависимости от зарегистрированного состояния и легко управлять его размером.

Некоторые методы предназначены только для случая.

В качестве примечания вы также можете поместить представление кнопки из файла NIB, установив свой класс в FBCustomLoginView и его делегат, но любой размер, который вы установили, всегда будет сброшен до размера по умолчанию 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

Ответ 7

Думаю, я нашел гораздо более простой способ настроить текст, например, FBSDKLoginButton, не создавая полностью настраиваемую кнопку с нуля, содержащую все функции входа. Это хорошо, потому что FBSDKLoginButton выполняет всю работу - вам просто нужно изменить текст. Извините, я знаю только Swift... вот код:

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

Наслаждайтесь!

Ответ 8

Ответ на все ваши проблемы, включая метку после нажатия, очень прост: Это как ответ OZBA, просто удалите полностью UILabel (add: [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];
        }
    }
}

Ответ 9

Пожалуйста, прочитайте файл README в SDK для Facebook. Вы должны добавить Row - FacebookBundleName в info.plist и поместить его в название своего пакета. Затем добавьте пакет в свой проект с этим именем и поместите в папки с именем "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";

Надеюсь, это поможет вам!

Ответ 10

Я просто нашел ответ для обновления текста кнопки при нажатии кнопки входа. У меня была та же проблема.

Как пробовать установить рамку метки кнопки на CGRectMake (0,0,0,0).

Я попробовал, и я думаю, что это сработало.

Добавьте этот код в ответ ozba:

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

Надеюсь, что это поможет.

Ответ 11

Я подумал о проблеме, и мне лично не понравился принятый ответ... По разным причинам. Все свободны независимо от того, что ему нравится, но я решил поделиться своим решением.

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, потому что класс может быть обычным в будущем.

Ответ 12

Расположите вид FB на экране или с размером 0x0. Затем установите действие кнопки, чтобы отправить сообщение buttonPressed: на вид FB. Я думаю, что это самый простой способ.

Ответ 13

В моем случае я создал красивую кнопку в Photoshop и просто положил ее поверх кнопки faceBook. (Я знаю, что Apple не советует ставить взгляд на кнопку. Но повторение на подзаголовках не выглядит приятным для меня). Трудно понять, почему такая компания, как 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];

Ответ 14

Если вы ссылаетесь на 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

Это немного рискованно, так как оно зависит от внутренних деталей реализации.

Ответ 15

Поскольку последняя версия 4.X Facebook SDK,

Пользовательский вход упрощается, используйте FBSDKLoginManager

Ответ 16

Согласно последней версии Facebook для iOS версии 2.3.

Вы можете использовать следующий фрагмент кода для входа через любой пользовательский UIButton.

- (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

Ответ 17

Простейшее решение

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)