UITextView не меняет свойство textColor - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть пользовательский класс UITextView:

class TitleTextView: UITextView {

    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }

    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        textColor = .brand100
        backgroundColor = .clear
        isUserInteractionEnabled = false
        textAlignment = .left
        isScrollEnabled = false
        let frameWidth = Constants.screenSize.width * 87.5 / 100
        font = UIFont.OpenSans(.semibold, size: (frameWidth * 8.55 / 100))
    }
 }

Я использовал этот пользовательский класс текстового представления внутри UIView.

class MyCustomHeaderView: UIView{

    @IBOutlet weak var titleTextView: TitleTextView!

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    override func layoutSubviews() {

        backgroundColor = .brand100

        titleTextView.text = "Market Place"
        titleTextView.textColor = .brand400

        layoutIfNeeded()

    }    

}

И я вызвал этот UIView в UIViewController.

private func setupTitleView() {
        let titleView = UINib(nibName: "TitleView", bundle: .main).instantiate(withOwner: nil, options: nil).first as! UIView
        titleView.frame = contentHeaderView.bounds
        contentHeaderView.addSubview(titleView)        
        view.layoutIfNeeded()
}

Но когда я устанавливаю свойство textColor в своем пользовательском UIView (MyCustomHeaderView), цвет не меняется.

Есть ли у вас какие-либо идеи о том, почему причина, по которой мой UITextView не применяется цвет, который я установил в своем пользовательском UIView? Я позвонил layoutIfNeed(), но это не работает.

1 Ответ

0 голосов
/ 03 февраля 2020

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

В вашем случае вы создаете экземпляр CustomHeaderView и вызывается схема для этого, следовательно, вызывается layoutSubviews Следующим шагом будет добавление textView к вашему CustomHeaderView, после чего вызывается текстовое представление layoutSubviews, которое переопределит ваш цвет.

Вы можете решить это двумя способами, я считаю. Хотя я не работаю с перьями и раскадровками,

во-первых:

class MyCustomHeaderView: UIView{

    @IBOutlet weak var titleTextView: TitleTextView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

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

    func setup() {

        backgroundColor = .brand100

        titleTextView.text = "Market Place"
        titleTextView.textColor = .brand400

        layoutIfNeeded()

    }    

}

Во-вторых, это большое возможно:

class MyCustomHeaderView: UIView{

    @IBOutlet weak var titleTextView: TitleTextView!

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    override func layoutSubviews() {
        defer {
            backgroundColor = .brand100

            titleTextView.text = "Market Place"
            titleTextView.textColor = .brand400

            layoutIfNeeded()
        }
    }    

}

Отсрочка будет ждать, пока все инициализируется перед запуском того, что находится в блоке. Я не знаю, как это работает с layoutSubviews

...