简体   繁体   中英

UITextView does not change textColor property

I have a UITextView custom class:

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))
    }
 }

I used this text view custom class inner a 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()

    }    

}

And I called this UIView in a 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()
}

But when I set the textColor property in my custom UIView (MyCustomHeaderView) the color doesn't change.

Do you have any idea about why the reason that my UITextView doesn't apply the color that I set in my custom UIView? I called layoutIfNeed() but this doesn't work.

It's because you are doing everything inside the layoutSubviews Which in itself is really bad practice.

In your case you instantiate the CustomHeaderView and the layout for that is called, hence calling layoutSubviews next step is that the textView is added to your CustomHeaderView and then the textView's layoutSubviews is called and will override your color.

You can solve this in two ways i believe. Altho i don't work with Nibs and storyboards,

first:

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()

    }    

}

Second, this is a big maybe:

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()
        }
    }    

}

Defer will wait till everything is been initialised before running whatever is in the block. I don't know tho how that works with layoutSubviews

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM