Подкласс UILabel не отображается при использовании ограничений - PullRequest
0 голосов
/ 09 ноября 2018

Я создал подкласс для управления своей темой, но не отображается ни на устройстве, ни на симуляторе.

Вот мой Header.swift:

import Foundation
import UIKit

class Header: UILabel {
    override var textColor: UIColor! {
        // White Color
        get { return ThemeManager.currentTheme.palette.primary }
        set {}
    }

    override var font: UIFont! {
        get { return ThemeManager.currentTheme.textStyle.headerText }
        set {}
    }
}

Здесь реализация: (внутри viewcontroller)

var titleLabel: Header = Header()

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .black

    // Background Image over the view
    setupBackground()

    setupStartButton()
    setupTitleLabel()

    print(titleLabel.frame)
}

// MARK: - Header
private func setupTitleLabel() {
    titleLabel.text = "0.0m"

    // titleLabel.font = ThemeManager.currentTheme.textStyle.headerText
    // titleLabel.textColor = ThemeManager.currentTheme.palette.primary

    view.addSubview(titleLabel)
    view.bringSubviewToFront(titleLabel)

    setupTitleLabelAutolayout()
}


private func setupTitleLabelAutolayout() {
    titleLabel.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor)
    ])
}

Но если я использую UILabel вместо Header, он будет работать как положено. Я также пытался реализовать init?(coder aDecoder: NSCoder) и init(frame: CGRect), но ничего не изменилось.

Если я установлю frame в init, тогда будет показан текст, но не стилизованный и игнорирующий мои ограничения.

Конечно, я что-то упускаю, но что?

Чтобы избежать полезности ответов, вот некоторые сведения:

  • Текстовый UILabel цвет белый
  • Фон черный и на нем изображение.
  • Я пытался удалить изображение и все вокруг, кроме ярлыка, и ничего не изменилось.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

Лучше было бы сделать расширение:

extension UILabel {
    func withHeaderStyle() -> UILabel {
        self.textColor = ThemeManager.currentTheme.palette.primary
        self.font = ThemeManager.currentTheme.textStyle.headerText
        return self
    }
}

Тогда в точке использования:

var titleLabel = UILabel().withHeaderStyle()

Вы можете создать несколько из этих методов withXStyle, а в момент использования вы можете связать их вместе. Это то, что вы не можете сделать с наследованием.


Как правило, вы должны использовать inherrence только тогда, когда хотите изменить поведение . Он плохо подходит для изменения данных.

0 голосов
/ 09 ноября 2018

Я исправил это, отредактировав Header к этому:

import Foundation
import UIKit

class Header: UILabel {
    override init(frame: CGRect) {
        super.init(frame: frame)

        setupStyle()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        setupStyle()
    }

    private func setupStyle() {
        self.textColor = ThemeManager.currentTheme.palette.primary
        self.font = ThemeManager.currentTheme.textStyle.headerText
    }
}

В принципе, если я правильно понял, когда я установил getter на этикетке, это ничего не значит (если подумать, это совершенно очевидно).

Я все еще думаю, что есть лучшие решения, но у меня это хорошо работает, так что я буду держать это.

Теперь вы можете спросить: «Почему вы переписали геттер вместо того, чтобы делать это?»

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

PS: я тоже пробовал с didSet, но он, очевидно, самопроизвольно перебирает его и вылетает.

...