it-swarm.com.de

Kann die Höhe des Login-Buttons in FBSDKLoginKit nicht ändern?

Ich verwende FBSDKLoginKit in iOS mit Swift.

Bis vor kurzem funktionierte es einwandfrei, aber ich kann jetzt die Höhe meiner Schaltfläche im Storyboard nicht überschreiben.

Die Höhe der Schaltfläche ist aus irgendeinem Grund jetzt viel kleiner. Ich habe versucht, Höhenbeschränkungen für die Schaltfläche festzulegen, die Schaltfläche in eine Stapelansicht zu setzen und so einzustellen, dass die Höhe der Schaltfläche im SDK proportional ausgefüllt und sogar überschrieben wird.

Wenn ich die Schaltfläche in ein normales UIButton ändere, funktionieren die Layout-Einschränkungen perfekt.

So sieht der Button aus, wenn ich die App starte.

This is what the button looks like when I run the app.

Auf diese Weise möchte ich, dass der Button in der Größe aussieht.

This is how I would like the button to look - size wise.

14
Ben Gilroy

Ich bin auch auf dieses Problem gestoßen. Der Grund dafür ist in der 4.18.0 bis 4.19.0 Upgrade-Anleitung :

Die Benutzeroberfläche von FBSDKLoginButton hat sich in 4.19.0 geändert. Anstelle von "Mit Facebook anmelden" wird nun "Mit Facebook fortfahren" angezeigt. Die Tastenfarbe wird von # 3B5998 auf # 4267B2 geändert. Die Höhe der Schaltflächen ist jetzt auf 28 festgelegt, da kleinere Schriftgrößen und Abstände um ein größeres Facebook-Logo verwendet werden.

Die einzige Problemumgehung, die ich bisher gefunden habe, ist das Downgrade der SDK-Version auf 4.18.0 (es hat die Arbeit für mich erledigt).

Es ist möglich, dass FB dieses Problem (das sie für viele Menschen erstellt haben) in einem der zukünftigen Updates des SDKs beheben wird.


In Richtung einer dauerhafteren Lösung können wir auf GitHub die spezifischen Änderungen, die dies verursacht haben sehen. Die Änderung, die ich am verdächtigsten finde, beginnt am Zeile 194 :

[self addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                 attribute:NSLayoutAttributeHeight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:nil
                                                 attribute:NSLayoutAttributeNotAnAttribute
                                                multiplier:1
                                                  constant:28]];

Wenn die obige Einschränkung entfernt/deaktiviert wird, kann dies helfen, die Situation umzukehren. Es sollte ungefähr so ​​aussehen (ich habe zum Zeitpunkt des Schreibens kein IDE zur Hand):

// Obtain all constraints for the button:
let layoutConstraintsArr = fbLoginButton.constraints
// Iterate over array and test constraints until we find the correct one:
for lc in layoutConstraintsArr { // or attribute is NSLayoutAttributeHeight etc.
   if ( lc.constant == 28 ){
     // Then disable it...
     lc.active = false
     break
   }
}

Wenn ich die Gelegenheit bekomme, das oben Genannte zu testen, oder wenn ich eine bessere Lösung finde, aktualisiere ich die Antwort.

22
Dev-iL

Also nahm ich die Lösung von @ Dev-iL und verbesserte sie etwas zukunftssicherer. Ich bin sehr neu in diesem Bereich, also habe ich ein paar Stunden gebraucht, um das herauszufinden, aber ich dachte, ich würde es teilen, da es die Höhenbeschränkung auf der Grundlage einer Höhenbeschränkung und nicht auf dem konstanten Wert deaktiviert. 

Ich habe in meinem Storyboard eine als Facebook-Schaltfläche klassifizierte Unteransicht verwendet und dort die neue Einschränkung festgelegt. 

Ich bevorzuge diese Methode und fühle mich sauberer. 

Hinweis: Ich glaube, für eine Höhenbeschränkung wird es immer der erste Wert sein. Bitte korrigieren Sie mich, wenn ich falsch liege, und ich werde mit einer Änderung aktualisieren. Wie gesagt, ich bin neu in diesem Bereich

Bearbeiten: Ich entschied mich für den konstanten Wert 28, damit die Einschränkung für meine Storyboard-Höhe beim Entfernen übersprungen werden kann. Dies ist nicht erforderlich, wenn Sie die Einschränkung nach dem Entfernen programmgesteuert hinzufügen

for const in fbLoginButton.constraints{
  if const.firstAttribute == NSLayoutAttribute.height && const.constant == 28{
    fbLoginButton.removeConstraint(const)
  }
}
8
Xion

Sie erreichen dies bequem mit einer einfachen Überschreibung des Facebook-Buttons.

Schnell:

class FacebookButton: FBSDKLoginButton {

    override func updateConstraints() {
        // deactivate height constraints added by the facebook sdk (we'll force our own instrinsic height)
        for contraint in constraints {
            if contraint.firstAttribute == .height, contraint.constant < standardButtonHeight {
                // deactivate this constraint
                contraint.isActive = false
            }
        }
        super.updateConstraints()
    }

    override var intrinsicContentSize: CGSize {
        return CGSize(width: UIViewNoIntrinsicMetric, height: standardButtonHeight)
    }

    override func imageRect(forContentRect contentRect: CGRect) -> CGRect {
        let logoSize: CGFloat = 24.0
        let centerY = contentRect.midY
        let y: CGFloat = centerY - (logoSize / 2.0)
        return CGRect(x: y, y: y, width: logoSize, height: logoSize)
    }

    override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
        if isHidden || bounds.isEmpty {
            return .zero
        }

        let imageRect = self.imageRect(forContentRect: contentRect)
        let titleX = imageRect.maxX
        let titleRect = CGRect(x: titleX, y: 0, width: contentRect.width - titleX - titleX, height: contentRect.height)
        return titleRect
    }

}

In diesem Code-Beispiel ist standardButtonHeight eine definierte Konstante mit der gewünschten Tastenhöhe.

Beachten Sie auch, dass die Logogröße von 24.0 dieselbe Größe wie in Version 4.18 des SDK verwendet.

7
cgossain

Derzeit hat die Facebook-Schaltfläche nur eine Einschränkung, nämlich die Höhenbeschränkung. Sie können einfach alle Einschränkungen der Schaltfläche entfernen und Ihre eigenen hinzufügen.

facebookSignInButton.removeConstraints(facebookSignInButton.constraints)

Natürlich kann sich dies in der Zukunft ändern und Sie können eine Einschränkung entfernen, die Sie nicht möchten. Eine bessere Lösung wäre möglicherweise, wenn Sie nur diese problematische Einschränkung entfernen.

if let facebookButtonHeightConstraint = facebookSignInButton.constraints.first(where: { $0.firstAttribute == .height }) {
    facebookSignInButton.removeConstraint(facebookButtonHeightConstraint)
}
4
gasho

In Anbetracht dessen, dass dies eine alte Frage ist, habe ich eine Lösung gefunden und schreibe sie als Antwort für die Zukunft.

Nachdem Sie das FBSDKLoginKit über einen Pod installiert haben, suchen Sie in XCODE links in Ihrem Verzeichnis und öffnen Sie Ihre PODS - nicht Ihre Poddatei. Öffnen Sie FBSDKLoginKit und öffnen Sie die Datei FBSDKLoginButton.m.

Sie sehen jetzt eine Warnung, die Sie darüber informiert, dass Sie gerade bearbeiten. Ignorieren Sie die Warnung, dh nehmen Sie die Nachricht zur Kenntnis und stellen Sie sicher, dass Sie nichts anderes als Ihre Zielinformationen ändern. Ändern Sie die beiden Felder, die die Höhe der Facebook-Schaltfläche in der Datei bestimmen, wie unten dargestellt:

Bilder, die Ihnen durch den Leitfaden oben helfen:

EINFACHSTE LÖSUNG, keine Notwendigkeit, sich mit programmgesteuerten Korrekturen zu befassen, tun Sie dies einfach im Storyboard

0
jackson meyer

Diese kleine Autoclosure in Swift 4.0 funktioniert auch einwandfrei, wenn Sie keinen Grund haben, die Einschränkung zu entfernen. Überschreiben Sie sie einfach.

let facebookLoginButton = FBSDKLoginButton()
if let constraint = facebookLoginButton.constraints.first(where: { (constraint) -> Bool in
    return constraint.firstAttribute == .height
}) {
    constraint.constant = 40.0
}

Oder wenn Sie es hassen, Aussagen sagen zu lassen:

let facebookLoginButton = FBSDKLoginButton()
facebookLoginButton.constraints.first(where: { (constraint) -> Bool in
    return constraint.firstAttribute == .height
})?.constant = 40.0
0
NoodleOfDeath

Wenn Sie nur die Höhe Ihrer Schaltfläche geändert haben, können Sie einfach die Konstante der bereits vorhandenen Höhenbeschränkung für die Schaltfläche anpassen, nachdem Sie die Schaltfläche in Ihr Storyboard eingefügt haben:

for constraint in facebookButton.constraints where constraint.firstAttribute == .height {
    constraint.constant = YOUR_Height
}

Dieser Code kann in viewDidLoad() eingefügt werden.

0
Andreas

Ich könnte es schaffen, die Höhe der Schaltfläche auf diese Weise zu ändern:

  • Ich habe dem Storyboard eine Ansicht facebookButtonView mit der gewünschten Größe hinzugefügt, und dann in viewDidLoad einfach Folgendes:

    let loginButton = LoginButton(frame: self.facebookButtonView.frame, readPermissions: [ .publicProfile ])
    self.view.addSubview(loginButton)
    

Der Facebook-Button hat die gleiche Größe wie der facebookButtonView. Ich habe es mit der Höhe 50 getestet und es funktioniert.

0
Gabriel Candia

Versuchen Sie als letzten Ausweg, Ihre eigene Schaltfläche als Facebook-Login-Schaltfläche zu implementieren. Sie verhindern möglicherweise die Anpassung der Schaltfläche aus dem SDK . https://developers.facebook.com/docs/Swift/login -- Hier gibt es einen Abschnitt mit Beispielcode - " Benutzerdefinierte Anmeldeschaltfläche ". Es scheint nicht kompliziert zu sein.

0

Wir hatten das gleiche Problem. Wir lösen dieses Problem, indem Sie die Schaltfläche im Code mit der Methode initWithFrame erstellen.

aus der Dokumentation 

FBSDKLoginButton hat eine feste Höhe von @c 30 Pixel, Sie können jedoch die Breite ändern. initWithFrame:CGRectZero Der Button wird auf den minimalen Rahmen eingestellt.

diese Lösung arbeitet für uns

let facebookButton = FBSDKLoginButton(frame:facebookButtonPlaceholder.bounds)
facebookButton.readPermissions = ["email"]
facebookButton.backgroundColor = UIColor.clear
facebookButtonPlaceholder.addSubview(facebookButton)
facebookButtonPlaceholder.backgroundColor = UIColor.clear
0
Alex

Autolayout funktioniert nicht mehr mit dem Facebook-Button (FBSDK-Button). Ich habe die Höhe mit dem Rahmen geändert.

    let fbLoginbutton = FBSDKLoginButton()

    view.addSubview(fbLoginbutton)

    fbLoginbutton.frame = CGRect(x: 38, y: 397, width: 300, height: 38)

Sie können es entsprechend Ihrer Anforderung einstellen. Obwohl ich immer noch nicht in der Lage bin, die Schriftart und das Logo zu ändern.

0
Suhail