it-swarm.com.ru

Не удается изменить высоту кнопки входа в 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.

14
Ben Gilroy

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

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

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

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


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

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

22
Dev-iL

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

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

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

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

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

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

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

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

facebookSignInButton.removeConstraints(facebookSignInButton.constraints)

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

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

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

После того, как вы установили FBSDKLoginKit через Pod, посмотрите в вашем каталоге слева в XCODE и откройте ваши PODS, а не ваш Podfile. Откройте FBSDKLoginKit и откройте файл FBSDKLoginButton.m.

Теперь вы увидите предупреждение о том, что вы редактируете. Не обращайте внимания на предупреждение, то есть обратите внимание на сообщение и убедитесь, что вы ничего не меняете, кроме своей целевой информации. Измените два поля, которые определяют высоту кнопки Facebook в файле, как показано ниже:

Фотографии, которые помогут вам в руководстве выше:

ПРОСТОЕ РЕШЕНИЕ, не нужно иметь дело с программными инструкциями, просто сделайте это в раскадровке

0
jackson meyer

Эта небольшая автозамена в Swift 4.0 также отлично работает, если у вас нет причин удалять ограничение, просто переопределите его.

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

Или, если вы ненавидите, пусть заявления:

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

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

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

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

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

0
Gabriel Candia

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

0
Denislava Shentova

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

Autolayout больше не работает на кнопке Facebook (FBSDKButton). Я изменил его высоту с помощью кнопок рамки.

    let fbLoginbutton = FBSDKLoginButton()

    view.addSubview(fbLoginbutton)

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

Вы можете установить его в соответствии с вашими требованиями. Хотя я до сих пор не могу изменить его шрифт и размер логотипа.

0
Suhail