web-dev-qa-db-fra.com

Impossible de modifier la hauteur du bouton de connexion dans FBSDKLoginKit?

J'utilise FBSDKLoginKit dans iOS avec Swift.

Jusqu'à récemment, cela fonctionnait parfaitement, mais je ne peux pas maintenant remplacer la hauteur de mon bouton dans le Storyboard?

La hauteur du bouton est maintenant beaucoup plus petite pour une raison quelconque. J'ai essayé de définir des contraintes de hauteur pour le bouton, de placer le bouton dans une vue de pile et de définir un remplissage proportionnel et même de remplacer la hauteur du bouton dans le SDK sans succès.

Si je change le bouton en un UIButton normal, les contraintes de présentation fonctionnent parfaitement.

Voici à quoi ressemble le bouton lorsque je lance l'application.

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

C'est comme ça que je voudrais que le bouton ressemble à sa taille.

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

14
Ben Gilroy

J'ai aussi rencontré ce problème. La raison en est expliquée dans le 4.18.0 à 4.19.0 guide de mise à niveau }:

L'interface utilisateur FBSDKLoginButton a été modifiée en 4.19.0. Au lieu de "Connexion avec Facebook", le bouton affiche maintenant "Continuer avec Facebook". La couleur du bouton est modifiée en # 4267B2 à partir de # 3B5998. La hauteur du bouton est maintenant fixée à 28 en raison de l’utilisation de polices de caractères et de rembourrages plus petits autour du logo Facebook plus grand.

La seule solution que j'ai trouvée jusqu'à présent consiste à rétrograder la version du SDK à 4.18.0 (le travail a été fait pour moi).

Il est possible que FB résolve ce problème (... qu'il a créé pour de nombreuses personnes) dans l'une des futures mises à jour du SDK.


Vers une solution plus permanente, nous pouvons voir le modifications spécifiques qui ont provoqué cela, sur GitHub . Le changement que je trouve le plus suspect commence sur ligne 194 :

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

Si la contrainte ci-dessus est supprimée/désactivée, cela pourrait aider à inverser la situation. Cela devrait ressembler à peu près à ceci (je n’ai pas de IDE au moment de la rédaction):

// 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
   }
}

Lorsque j'aurai l'occasion de tester ce qui précède ou si je trouve une meilleure solution, je mettrai à jour la réponse.

22
Dev-iL

J'ai donc pris la solution de @ Dev-iL et l'ai modifiée pour en faire quelque chose d'un peu plus sûr. Comme je suis très nouveau dans ce domaine, il m'a fallu quelques heures pour le comprendre, mais je pensais partager, car cela désactive spécifiquement la contrainte de hauteur basée sur le fait d'être une contrainte de hauteur plutôt que sur la valeur constante. 

J'ai utilisé une sous-vue classée comme bouton Facebook dans mon story-board et y ai défini la nouvelle contrainte. 

Je préfère cette méthode et pense que c'est une approche plus propre. 

Note: Je crois que pour une contrainte de hauteur, ce sera toujours la première valeur, mais corrigez-moi si je me trompe et je mettrai à jour avec une édition. Comme je l'ai mentionné, je suis nouveau dans ce domaine

Éditer: j'ai décidé d'inclure la valeur constante de 28 pour que la contrainte de hauteur de mon storyboard soit ignorée lors du retrait. Cela n'est pas nécessaire si vous ajoutez la contrainte par programme après la suppression.

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

Vous pouvez facilement y parvenir avec une simple substitution du bouton Facebook.

Rapide:

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
    }

}

Dans cet exemple de code, standardButtonHeight est une constante définie avec la hauteur de bouton souhaitée.

Notez également que la taille du logo 24.0 est identique à celle utilisée dans la version 4.18 du SDK.

7
cgossain

Pour l'instant, le bouton Facebook n'a qu'une contrainte, la hauteur. Vous pouvez simplement supprimer toutes les contraintes du bouton et ajouter le vôtre.

facebookSignInButton.removeConstraints(facebookSignInButton.constraints)

Mais bien sûr, cela peut changer dans le futur et vous pouvez supprimer une contrainte que vous ne voulez pas. Une meilleure solution serait peut-être de ne supprimer que cette contrainte problématique.

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

Conscient que cette question est ancienne, j’ai trouvé une solution et je l’affiche comme réponse pour référence future.

Une fois que vous avez installé le FBSDKLoginKit via un pod, recherchez votre répertoire à gauche dans XCODE et ouvrez votre PODS - pas votre podfile. Ouvrez FBSDKLoginKit et le fichier FBSDKLoginButton.m.

Vous allez maintenant voir une alerte indiquant que vous éditez. Ignorer l'alerte, c'est-à-dire prendre connaissance du message et assurez-vous de ne rien changer d'autre que vos informations de cible. Modifiez les deux champs qui dictent la hauteur du bouton Facebook dans le fichier, comme indiqué ci-dessous:

Images pour vous aider à travers le guide ci-dessus:

SOLUTION LA PLUS FACILE, inutile de s’occuper des conséquences programmatiques, il suffit de le faire dans le scénarimage

0
jackson meyer

Cette petite fermeture automatique dans Swift 4.0 fonctionne également parfaitement si vous n’avez aucune raison de supprimer la contrainte, remplacez-la.

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

Ou si vous détestez laisser des déclarations:

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

Je pouvais arriver à changer la hauteur du bouton de cette façon:

  • J'ai ajouté une vue facebookButtonView au storyboard avec la taille que je veux, puis dans viewDidLoad, je fais simplement ceci:

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

Le bouton Facebook prend la même taille que FacebookButtonView. J'ai testé avec la hauteur 50 et ça marche.

0
Gabriel Candia

En dernier recours, essayez d'implémenter votre propre bouton personnalisé pour agir en tant que bouton de connexion à Facebook. Ils pourraient empêcher la personnalisation du bouton à partir du SDK . https://developers.facebook.com/docs/Swift/login -- Il y a ici une section avec un exemple de code - " Bouton de connexion personnalisé ". Cela ne semble pas compliqué.

0
Denislava Shentova

Nous avons eu le même problème. Nous résolvons ce problème en créant le bouton dans le code avec la méthode initWithFrame.

de la documentation 

FBSDKLoginButton a une hauteur fixe de @c 30 pixels, mais vous pouvez modifier la largeur. initWithFrame:CGRectZero redimensionnera le bouton à son cadre minimal.

cette solution fonctionne pour nous

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

L'autolayout ne fonctionne plus sur le bouton Facebook (FBSDKButton). J'ai changé sa hauteur en utilisant le cadre des boutons.

    let fbLoginbutton = FBSDKLoginButton()

    view.addSubview(fbLoginbutton)

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

Vous pouvez le définir selon vos besoins. Bien que je ne sois pas encore en mesure de changer la taille de la police et du logo.

0
Suhail