Почему установка шрифта UIButton мешает моим слоям - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь создать интерфейс регистрации входа в Swift для iOS без использования раскадровки.

С этим кодом в моем контроллере:

    loginButton.translatesAutoresizingMaskIntoConstraints = false
    loginButton.layer.borderWidth = 1
    loginButton.clipsToBounds = true
    loginButton.layer.borderColor = UIColor.Palette.boldYellow.cgColor
    loginButton.setTitle("Login", for: .normal)
    loginButton.setTitleColor(UIColor.Palette.boldYellow, for: .normal)
    loginButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 24)
    loginButton.heightAnchor.constraint(equalToConstant: 58).isActive = true
    NSLayoutConstraint(item: loginButton, attribute: .leading, relatedBy: .equal, toItem: footerView, attribute: .leading, multiplier: 1, constant: 30).isActive = true
    NSLayoutConstraint(item: loginButton, attribute: .trailing, relatedBy: .equal, toItem: footerView, attribute: .trailing, multiplier: 1, constant: -30).isActive = true
    NSLayoutConstraint(item: loginButton, attribute: .top, relatedBy: .equal, toItem: footerView, attribute: .top, multiplier: 1, constant: 21).isActive = true

    registerButton.translatesAutoresizingMaskIntoConstraints = false
    registerButton.clipsToBounds = true
    registerButton.setTitle("Register", for: .normal)
    registerButton.setTitleColor(.white, for: .normal)
    registerButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 24)
    registerButton.heightAnchor.constraint(equalToConstant: 58).isActive = true
    NSLayoutConstraint(item: registerButton, attribute: .leading, relatedBy: .equal, toItem: footerView, attribute: .leading, multiplier: 1, constant: 30).isActive = true
    NSLayoutConstraint(item: registerButton, attribute: .trailing, relatedBy: .equal, toItem: footerView, attribute: .trailing, multiplier: 1, constant: -30).isActive = true
    NSLayoutConstraint(item: registerButton, attribute: .bottom, relatedBy: .equal, toItem: footerView, attribute: .bottom, multiplier: 1, constant: -21).isActive = true

Я могу добиться этого:

enter image description here

Но я бы хотел сделать текст "Регистрация" более жирным, поэтому добавляю следующую строку:

registerButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 24)

Прямо перед

registerButton.heightAnchor.constraint(equalToConstant: 58).isActive = true

Но тогда весь интерфейс сломан, и я получил это:

enter image description here

Похоже, что изменения, которые я внес в слой обеих кнопок, не применяются.

Я делаю эти изменения слоя в переопределении viewDidLayoutSubviews моего контроллера:

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let gradientBackgroundButton = CAGradientLayer()
    gradientBackgroundButton.frame = registerButton.bounds
    gradientBackgroundButton.startPoint = CGPoint.zero
    gradientBackgroundButton.endPoint = CGPoint(x: 1, y: 1)
    gradientBackgroundButton.colors = [UIColor.Palette.lightYellow.cgColor, UIColor.Palette.boldYellow.cgColor]

    registerButton.layer.insertSublayer(gradientBackgroundButton, at: 0)

    registerButton.layer.cornerRadius = registerButton.bounds.height / 2
    loginButton.layer.cornerRadius = loginButton.bounds.height / 2
}

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

1 Ответ

0 голосов
/ 31 октября 2018

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

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

...