无法更改FBSDKLoginKit中登录按钮的高度?

Ben*_*roy 16 storyboard ios facebook-login facebook-ios-sdk swift

FBSDKLoginKit在iOS中使用Swift.

直到最近它一直工作得很好,但我现在无法覆盖故事板中按钮的高度?

由于某些原因,按钮的高度现在要小得多.我已经尝试为按钮设置高度约束,将按钮放在堆栈视图中并设置为按比例填充,甚至覆盖SDK中的按钮高度,没有运气.

如果我将按钮更改为正常,UIButton则布局约束可以完美地工作.

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

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

这就是我希望按钮看起来的方式 - 大小明智.

这就是我希望按钮看起来的方式 - 大小明智.

Dev*_*-iL 22

我也遇到过这个问题.这样做的原因是在解释4.18.0,以4.19.0升级指南:

FBSDKLoginButtonUI在4.19.0已经改变.该按钮现在显示"继续使用Facebook",而不是"使用Facebook登录".按钮颜色从#3B5998更改为#4267B2.由于使用较小的字体大小和较大的Facebook徽标周围的填充,按钮高度现在固定为28.

到目前为止,我发现的唯一解决方法是将SDK版本降级为4.18.0(它为我完成了工作).

在未来的SDK更新中,FB可能会解决这个问题(......他们为很多人创建了这个问题).


为了获得更持久的解决方案,我们可以在GitHub上看到导致此问题具体更改.我发现最可疑的变化在线194开始:

[self addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                 attribute:NSLayoutAttributeHeight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:nil
                                                 attribute:NSLayoutAttributeNotAnAttribute
                                                multiplier:1
                                                  constant:28]];
Run Code Online (Sandbox Code Playgroud)

如果删除/禁用上述约束,则可以帮助扭转这种情况.它应该看起来像这样(我在撰写本文时手头还没有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
   }
}
Run Code Online (Sandbox Code Playgroud)

当我有机会测试上述内容或者如果我找到更好的解决方案时,我会更新答案.

  • 太棒了!即使我不知道Swift,这是适合我的解决方案.这是我的代码:NSArray*fbConstraint = [_facebookLoginButton constraints]; for(int i = 0; i <[fbConstraint count]; i ++){if([[fbConstraint objectAtIndex:i] constant] == 28){[[fbConstraint objectAtIndex:i] setActive:NO]; }} (4认同)

cgo*_*ain 10

您只需简单地覆盖facebook按钮即可轻松实现此目的.

迅速:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

在此代码中,样本standardButtonHeight是具有所需按钮高度的已定义常量.

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

  • @cgosssain 感谢您发布此信息!当然,Facebook 徽标位置正确有助于让它看起来更好! (2认同)

Xio*_*ion 8

因此,我采用了@ Dev-iL的解决方案,并将其调整为更具未来性的证据.我对此非常陌生,所以我花了几个小时来搞清楚,但我认为我会分享,因为它基于高度约束而不是基于常量值来专门停用高度约束.

我在故事板中使用了一个归类为Facebook按钮的子视图,并在那里设置了新约束.

我更喜欢这种方法,并感觉它更清洁.

注意:我相信高度限制它始终是第一个值但是如果我错了请更正我,我会用编辑更新.正如我所提到的,我是新手

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

for const in fbLoginButton.constraints{
  if const.firstAttribute == NSLayoutAttribute.height && const.constant == 28{
    fbLoginButton.removeConstraint(const)
  }
}
Run Code Online (Sandbox Code Playgroud)


gas*_*sho 5

到目前为止,Facebook按钮只有一个约束,即高度约束,您可以删除按钮的所有约束并添加您的约束。

facebookSignInButton.removeConstraints(facebookSignInButton.constraints)
Run Code Online (Sandbox Code Playgroud)

但是,当然这会在将来发生变化,并且您可能会删除不需要的约束。如果仅删除有问题的约束,也许是一个更好的解决方案。

if let facebookButtonHeightConstraint = facebookSignInButton.constraints.first(where: { $0.firstAttribute == .height }) {
    facebookSignInButton.removeConstraint(facebookButtonHeightConstraint)
}
Run Code Online (Sandbox Code Playgroud)