Подтвердить что ты не робот

Невозможно изменить высоту кнопки входа в FBSDKLoginKit?

Я использую FBSDKLoginKit в iOS с Swift.

До недавнего времени он работал отлично, однако теперь я не могу переопределить высоту своей кнопки в раскадровке?

По этой причине высота кнопки теперь намного меньше. Я попытался установить ограничения высоты для кнопки, поместив кнопку в виде стека и установив, чтобы она пропорционально заполняла и даже переопределяла высоту кнопки в SDK без везения.

Если я сменил кнопку на обычный UIButton, ограничения макета отлично работают.

Вот как выглядит кнопка при запуске приложения.

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

Вот как бы я хотел, чтобы кнопка выглядела - размер мудрый.

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

4b9b3361

Ответ 1

Я также столкнулся с этой проблемой. Причина этого объясняется в 4.18.0 to 4.19.0 руководстве по обновлению:

Пользовательский интерфейс FBSDKLoginButton изменился в 4.19.0. Вместо "Войти в Facebook" на кнопке теперь отображается "Продолжить с Facebook". Цвет кнопки изменяется на # 4267B2 из # 3B5998. Высота кнопки теперь установлена ​​на уровне 28 из-за использования меньшего размера шрифта и прокладок вокруг более крупного логотипа Facebook.

Единственным обходным решением, которое я нашел до сих пор, является понизить версию SDK до 4.18.0 (он выполнил эту работу для меня).

Возможно, что FB рассмотрит эту проблему (..., которую они создали для многих людей) в одном из будущих обновлений SDK.


На пути к более постоянному решению мы можем увидеть конкретные изменения, вызвавшие это, на GitHub. Изменение, которое я нахожу наиболее подозрительным, начинается с line 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
   }
}

Когда у меня появится возможность проверить вышеизложенное или если я найду лучшее решение, я обновлю ответ.

Ответ 2

Итак, я принял решение @Dev-iL и изменил его на нечто большее, чем будущее. Я очень новичок в этом, поэтому мне потребовалось несколько часов, чтобы понять это, но я думал, что буду делиться, потому что он специально деактивирует ограничение высоты, основанное на ограничении высоты, а не на основе постоянного значения.

Я использовал subview, классифицированный как кнопка Facebook, в своем раскадровке и установил там новое ограничение.

Я предпочитаю этот метод и чувствую его более чистый подход.

Примечание. Я считаю, что для ограничения высоты это всегда будет первое значение, но, пожалуйста, исправьте меня, если я ошибаюсь, и я обновлю его. Как я уже говорил, я новичок в этом

Изменить: я решил включить постоянное значение 28, чтобы разрешить мое ограничение высоты раскадровки во время удаления. Это не требуется, если вы добавляете ограничение программно после удаления

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

Ответ 3

У нас была та же проблема. Мы решаем эту проблему, создавая кнопку в коде с помощью метода initWithFrame.

из документации

FBSDKLoginButton имеет фиксированную высоту @c 30 пикселей, но вы можете изменить ширину. initWithFrame:CGRectZero будет изменять размер кнопки до минимального кадра.

это решение работает для нас

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

Ответ 4

На данный момент кнопка Facebook имеет только одно ограничение, которое является ограничителем высоты, и вы можете просто удалить все ограничения кнопки и добавить свои.

facebookSignInButton.removeConstraints(facebookSignInButton.constraints)

Но, конечно, это может измениться в будущем, и вы можете удалить ограничение, которого вы не хотите. Возможно, лучшее решение было бы, если бы вы удалили только это проблемное ограничение.

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

Ответ 5

В качестве последнего средства попробуйте реализовать свою собственную пользовательскую кнопку, чтобы действовать как кнопка входа в систему Facebook. Они могут препятствовать настройке кнопки из SDK. https://developers.facebook.com/docs/swift/login - Здесь есть раздел с примером кода - "Пользовательская кнопка входа". Это не кажется сложным.

Ответ 6

Вы можете легко достичь этого с помощью простого переопределения кнопки facebook.

Swift:

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 определена определенная константа с желаемой высотой кнопки.

Также обратите внимание, что размер логотипа 24.0 - тот же размер, который используется в версии 4.18 SDK.

Ответ 7

Мне удалось изменить высоту кнопки таким образом:

  • Я добавил просмотр facebookButtonView в раскадровку с размером, который хочу, а затем в viewDidLoad я просто делаю это:

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

Кнопка Facebook имеет тот же размер, что и facebookButtonView. Я тестировал с высотой 50 и работал.