2017-02-02 4 views
11

Я использую FBSDKLoginKit в iOS с Swift.Невозможно изменить высоту кнопки входа в FBSDKLoginKit?

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

Высота кнопки в настоящее время значительно меньше по причине. Я попытался установить ограничения высоты для кнопки, поместив кнопку в виде стека и установив, чтобы заполнить пропорционально и даже переопределить высоту кнопки в 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.

ответ

17

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

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

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

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


К более постоянного решения, мы можем увидеть specific changes that caused this, on 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 
    } 
} 

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

+1

Для кого-то интересно, вы можете поместить этот код в 'override func viewDidLoad()'. Работал для меня. Благодарю. – Oliver

+2

Это прекрасно! Хотя я не знаю Swift, это решение, которое работает для меня. Вот мой код: NSArray * fbConstraint = [_facebookLoginButton constraints]; for (int i = 0; i <[fbConstraint count]; i ++) { if ([[fbConstraint objectAtIndex: i] constant] == ​​28) { [[fbConstraint objectAtIndex: i] setActive: NO]; }} –

+0

@FranklinKesler отлично работает, спасибо –

0

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

1

У нас была та же проблема. Мы решаем эту проблему, создавая кнопку в коде с помощью метода 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 
+0

По какой-то причине это работает на iPhone, но делает кнопку невидимой для iPad. Не знаю, почему. – user3798602

1

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

facebookSignInButton.removeConstraints(facebookSignInButton.constraints) 

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

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

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

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

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

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

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

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

Вы можете удобно достигнуть этого с простым отключением кнопки 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 
    } 

} 

В этом примере кода standardButtonHeight представляет собой определенную константу с желаемой высоты кнопки.

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

0

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

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

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

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

Смежные вопросы