无法更改FBSDKLoginKit中的loginbutton的高度?

我使用FBSDKLoginKit在iOS中使用FBSDKLoginKit

直到最近它一直在完美的工作,但是我现在不能覆盖在故事板中的button的高度?

由于某种原因,button的高度现在更小了。 我已经尝试设置button的高度约束,将button放在堆栈视图中,并设置按比例填充,甚至覆盖SDK中的button高度,没有运气。

如果我将button更改为一个正常的UIButton的布局约束完美的工作。

这是运行应用程序时button的样子。

这是运行应用程序时按钮的样子。

这就是我想要的button看起来大小明智。

这就是我想要的按钮看起来大小明智。

我也遇到了这个问题。 其原因在4.18.04.19.0升级指南中有解释:

FBSDKLoginButton UI已经在4.19.0中改变了。 现在,button显示“Continue with Facebook”,而不是“使用Facebooklogin”。 button颜色从#3B5998更改为#4267B2。 由于较大的Facebook徽标周围使用较小的字体大小和填充,现在将button高度固定为28。

我发现迄今唯一的解决方法是将SDK版本降级到4.18.0 (它为我做了这个工作)。

FB可能会解决这个问题(他们已经为很多人创build了这个问题)。


为了达到更持久的解决scheme,我们可以在GitHub上看到导致这个问题的具体变化 。 我发现最可疑的变化从第194行开始:

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

如果上述限制被删除/禁用,它可以帮助扭转这种情况。 它应该看起来像这样(写作时我手头没有IDE):

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

当我有机会testing上述或如果我find一个更好的解决scheme,我会更新答案。

所以我采取了@ Dev-iL的解决scheme,并调整了一些更多的未来的certificate。 我很新,所以花了我几个小时才弄明白,但我想我会分享,因为它是基于高度约束而不是基于恒定值来特别地停用高度约束。

我在故事板中使用了一个子视图作为Facebookbutton,并在那里设置了新的约束条件。

我更喜欢这种方法,感觉它是一个更清洁的方法。

注意:我相信对于高度限制,它始终是第一个值,但如果我错了,请纠正我,我会更新一个编辑。 正如我所说,我是新来的

编辑:我决定包括28的常数值,以允许在删除过程中跳过我的故事板高度约束。 如果您在删除后以编程方式添加约束,则不需要这样做

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

我们有同样的问题。 我们通过使用initWithFrame方法在代码中创buildbutton来解决这个问题。

从文档

FBSDKLoginButton具有@c 30像素的固定高度,但是您可以更改宽度。 initWithFrame:CGRectZero将button的大小设置为最小值。

这个解决scheme正在为我们工作

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

至于现在Facebookbutton只有一个约束是高度约束,你可以删除button的所有约束,并添加你的。

 facebookSignInButton.removeConstraints(facebookSignInButton.constraints) 

但是,这当然可以在将来改变,你可能会删除一个你不想要的约束。 也许更好的解决scheme是,如果你只删除有问题的约束。

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

作为最后的手段,尝试实现您自己的自定义button来充当Facebookloginbutton。 他们可能会阻止从SDK中button的自定义。 https://developers.facebook.com/docs/swift/login – 这里有一个部分的示例代码 – “自定义loginbutton”。 这似乎并不复杂。

你可以通过一个简单的Facebookbutton覆盖来方便地实现这一点。

迅速:

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

在这个代码示例中, standardButtonHeight是一个具有所需button高度的已定义常量。

另请注意,徽标大小24.0与SDK版本4.18中使用的大小相同。