it-swarm.com.ru

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

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

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

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

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

Спасибо

34
ozba

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

Я хотел быть 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];
    }
  }
}
9
dreampowder

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

ответ Озбы своего рода работает, но, по моему мнению, его следует использовать {не следует.

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

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

8
Bogdan Raducan

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


             }];

         }
     }];

}
6
Damien Romito

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

Некоторые методы для просто на всякий случай.

Как примечание, вы также можете поместить представление кнопки из файла NIB, установив для его класса значение FBCustomLoginView и его делегата, но независимо от того, какой размер вы установите, он всегда будет сброшен до размера по умолчанию FBLoginView, поэтому вы всегда должны устанавливать определенный размер в коде. (Я не знаю, как получить размер кадра из NSCoder, чтобы избежать этого)

Код существует, вы можете редактировать его и отвечать за любые ошибки в нем. Я буду редактировать этот ответ по мере его нахождения. Надеюсь это кому-нибудь пригодится.

Если вы добавляете его из 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
3
htafoya

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

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

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

3
Matt Schwartz

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

3
Luca Rocchi

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

Я только что нашел ответ на обновление текста кнопки при нажатии на кнопку входа. Я страдал от той же проблемы.

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

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

Добавьте этот код к ответу Озбы:

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

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

1
jmac

Пожалуйста, прочитайте файл README в Facebook SDK. Вы должны добавить 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";

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

1
Mellaito

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

0
pachun

Согласно последней версии Facebook Login для 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

0
n.by.n

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

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

0
Dumoko

Самое простое решение

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)
0
ZAFAR007

Если вы обратитесь к 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

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

0
Ian Newson

В моем случае я создал красивую кнопку в фотошопе и просто поместил ее поверх кнопки 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];
0
Mike.R

Начиная с последней версии 4.X Facebook SDK,

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

0
Vineeth Joseph