it-swarm.com.de

Wie kann man FBLoginVIew anpassen?

Um in meiner iOS-App eine Verbindung zu Facebook herzustellen, verwende ich FBLoginVIew von Facebook SDK für iOS .

Es zeigt einen Nice FB Login Button, aber ich möchte mein eigenes Bild und Text für den Login Button verwenden .. Das Problem ist, dass ich nirgendwo sehe, wie ich das anpassen kann.

Ich habe es geschafft, das Hintergrundbild der Anmeldungsschaltfläche zu ändern, indem ich die Bilder in FacebookSDKResources.bundle/FBLoginView/images überschreibe. Ich konnte jedoch nicht finden, wo der Text und die Position der Anmeldungsschaltfläche geändert werden soll. Daher bleibt "Anmelden" ...

Lösung, jemand?

Vielen Dank

34
ozba

Die Antwort besteht darin, die FBLoginView-Subviews zu durchsuchen, die Schaltfläche und das Label zu finden und sie anzupassen.

Hier ist der Code:

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

Ich wollte FBLoginview-Shows als UIBarbutton sein, also habe ich einen einfachen Ansatz gemacht: 

Zuerst habe ich FBLoginView als Eigenschaft hinzugefügt:

@property (nonatomic, strong) FBLoginView* loginView;

Und dann habe ich die Login-Ansicht außerhalb der Ansicht hinzugefügt:

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

Und dann habe ich ein Standard-UIbarbuttonItem hinzugefügt 

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

Und dann habe ich die Bar-Schaltfläche gesetzt, um die Klick-Aktion des FBLoginView auszulösen;)

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

Als ich dies schreibe, hat Facebook bereits Version 3.0 seines SDK für iOS veröffentlicht.

die Antwort von ozba funktioniert, aber meiner Meinung nach sollte sie nicht verwendet werden.

  • Erstens, und am wichtigsten, ist es eine allgemeine Regel, dass das Durchlaufen der Unteransichten/Superviews einer SDK-Komponente eine schlechte Praxis ist, weil die Hierarchie kann sich zwischen den SDK-Versionen ändern, was zu Fehlern führt, die schwer zu verfolgen sind und dann reparieren.
  • Zweitens wird beim Klicken auf die Schaltfläche für ein oder zwei Sekunden der ursprüngliche Text wiederhergestellt.

Meine Lösung ist wirklich einfach. In Facebooks heruntergeladenem Ordner FacebookSDK haben Sie einen Ordner mit dem Namen Samples. Dort müssen Sie im SessionLoginSample nachsehen. Sie können sehen, dass sie einen gewöhnlichen runden Rechteckknopf haben, der über den ViewController, dem er gehört, den FBLoginViewDelegate hat , kann der Text je nach FBSession-Status geändert werden. Vertrau mir, es ist ganz einfach.

8
Bogdan Raducan

Oder lesen Sie die Dokumentation von Facebook, um Ihren eigenen Button zu erstellen:

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

so was: 

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

Ich erstelle eine benutzerdefinierte FB-Button-Klasse für den Fall, dass ich sie für andere Projekte recyceln muss. Es handelt sich immer noch um eine First-Version. Das Button-Image kann jedoch je nach protokolliertem Status geändert und seine Größe problemlos verwaltet werden.

Einige Methoden sind nur für den Fall gedacht.

Hinweis: Sie können die Schaltflächenansicht auch aus der NIB-Datei platzieren, indem Sie ihre Klasse auf FBCustomLoginView und ihren Delegaten setzen. Die von Ihnen festgelegte Größe wird jedoch immer auf die Standardgröße von FBLoginView zurückgesetzt. Sie müssen daher die spezifische Größe im Code festlegen. (Ich weiß nicht, wie ich die Frame-Größe von NSCoder erhalten kann, um dies zu vermeiden.)

Code ist AS-IS, Sie können ihn bearbeiten und sind für etwaige Fehler verantwortlich. Ich werde diese Antwort bearbeiten, sobald ich welche finde. Ich hoffe es ist jemandem nützlich.

Wenn Sie es von NIB hinzufügen, passen Sie es einfach mit dem gewünschten Text und den gewünschten Bildern an. Der Rest funktioniert wie eine 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

Ich glaube, ich habe einen viel einfacheren Weg gefunden, um den Text beispielsweise eines FBSDKLoginButton anzupassen, ohne eine vollständig benutzerdefinierte Schaltfläche erstellen zu müssen, die alle Anmeldefunktionen enthält. Das ist schön, weil der FBSDKLoginButton die ganze Arbeit erledigt - Sie müssen nur den Text ändern. Sorry, ich kenne nur Swift ... hier ist der Code:

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

Genießen!

3
Matt Schwartz

text im Facebook-Ressourcenpaket ändern de.lproj Localizable.strings ... ich nehme an, dass es funktioniert

3
Luca Rocchi

Die Antwort auf alle Probleme, einschließlich des Labels, nachdem das Login gedrückt wurde, ist sehr einfach: Es ist wie eine OZBA-Antwort. Entfernen Sie einfach die UILabel (add: [loginLabel removeFromSuperview];).

Dies ist der vollständige Arbeitscode:

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

Ich habe gerade eine Antwort auf die Aktualisierung des Schaltflächentextes gefunden, wenn Sie auf die Anmeldeschaltfläche klicken. Ich hatte das gleiche Problem.

Versuchen Sie, den Rahmen der Schaltflächenbeschriftung auf CGRectMake (0,0,0,0) einzustellen.

Ich habe es ausprobiert und ich glaube es hat funktioniert.

Fügen Sie diesen Code zur Antwort von ozba hinzu:

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

Hoffe das hilft.

1
jmac

Bitte lesen Sie die Datei README im Facebook SDK. Sie müssen die Zeile - FacebookBundleName in info.plist hinzufügen und einen Namen für Ihr Bundle eingeben. Fügen Sie Ihrem Projekt dann ein Paket mit diesem Namen hinzu und legen Sie es in Ordnern mit dem Namen "lang.lproj" ab. Beispiel: en.lproj - it.lproj - fr.lproj - es.lproj .... In diese Ordner müssen Sie Fügen Sie die Datei Localizable.strings hinzu, dann können Sie viele Sätze lokalisieren, wie zum Beispiel:

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

Hoffe es hilft dir!

1
Mellaito

Positionieren Sie die FB-Ansicht außerhalb des Bildschirms oder mit einer Größe von 0x0. Stellen Sie dann die Aktion Ihrer Schaltfläche ein, um die Nachricht buttonPressed: an die FB-Ansicht zu senden. Ich denke, das ist der einfachste Weg.

0
pachun

Laut dem neuesten Facebook-Login für iOS Version 2.3.

Sie können das folgende Code-Snippet verwenden, um sich über eine benutzerdefinierte UIB-Taste anzumelden.

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

Hier ist der Link: https://developers.facebook.com/docs/facebook-login/ios/v2.3#login-apicalls

0
n.by.n

Ich dachte über das Problem nach und ich persönlich mochte die akzeptierte Antwort nicht wirklich ... Aus verschiedenen Gründen ... Jeder ist frei, welche Lösung er will, aber ich entschied mich dazu, meine eigene Lösung mitzuteilen. 

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

Ich habe respondsToSelector anstelle von isKindOfClass verwendet, da die Klasse in Zukunft möglicherweise benutzerdefiniert ist.

0
Dumoko

Einfachste Lösung

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

Wenn Sie sich auf https://github.com/facebook/facebook-ios-sdk/blob/master/src/UI/FBLoginView.m , Zeile 299 beziehen, sehen Sie, dass der Text von einer Instanz bereitgestellt wird Methode in FBLoginView. Daher können Sie diesen Text ändern, indem Sie Ihre eigene Klasse von FBLoginView ableiten und Ihre eigene Implementierung von logInText bereitstellen:

@interface CustomFBLoginView : FBLoginView

@end

@implementation CustomFBLoginView

-(NSString*) logInText {
    return @"Some custom text";
}

@end

Dies ist ein wenig riskant, da es von den internen Implementierungsdetails abhängig ist.

0
Ian Newson

In meinem Fall habe ich einen gut aussehenden Button in Photoshop erstellt und ihn einfach auf den faceBook-Button gelegt. (Ich weiß, dass Apple nicht empfiehlt, die Schaltfläche auf den Button zu setzen. Aber das Durchlaufen der Subviews ist für mich nicht nett). Es ist schwer zu verstehen, warum eine Firma wie FB keine einfache Möglichkeit dafür bot. 

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

Seit der neuesten Version 4.X Facebook SDK,

Das benutzerdefinierte Login wird vereinfacht, verwenden Sie FBSDKLoginManager

0
Vineeth Joseph