Цвет фона Swift UIButton не меняется - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующая пользовательская ячейка:

class MyCell: UITableViewCell {

    func configure(title1: String, title2: String) {
        backgroundColor = .red

        let myView = MyView(frame: frame)
        myView.button1.setTitle(title1, for: .normal)
        myView.button2.setTitle(title2, for: .normal)

        addSubview(myView)
    }
}

и пользовательский вид:

class MyView: UIView {
    var button1: UIButton!
    var button2: UIButton!

    override var backgroundColor: UIColor? {
        didSet {
            guard UIColor.clear.isEqual(backgroundColor) else { return }
            button1.setTitle("asldkfa")
            button1.backgroundColor = .blue
            button2.backgroundColor = .yellow
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        button1 = UIButton()
        button2 = UIButton()
        button1.backgroundColor = .purple
        button2.backgroundColor = .brown
        backgroundColor = .gray

        let stackView = UIStackView(); stackView.distribution = .fill; stackView.alignment = .fill
        stackView.addArrangedSubview(button1)
        stackView.addArrangedSubview(button2)

        addSubview(stackView)
    }
}

Я инициализировал представление ячейки в моем методе tableView:cellForRowAt следующим образом:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyCell
cell.configure(title1: "Foo", title2: "Bla")

Я получаю следующий вывод в моем tableView:

table cell

Каждый раз, когда цвет MyView изменяется внешне (например, при нажатии на ячейку), я хочу, чтобы цвета кнопок менялись - поэтому я переопределил наблюдатель didSet для backgroundColor в MyView. В конце концов я хочу, чтобы эти цвета были случайными, но здесь я просто пытаюсь изменить button1.backgroundColor = .blue.

Не работает, цвет кнопок не меняется. Я даже попытался изменить tintColor, и он также не работает. Изменение заголовка с помощью button1.setTitle(...) работает, поэтому я понятия не имею, что происходит.

У кого-нибудь есть идея?

Заранее спасибо.

EDIT

Когда я собираю приложение, добавьте button1.setTitle("asldkfa", for: .normal) в didSet и щелкните по ячейке, это будет вывод:

enter image description here

Это означает, что backgroundColor установлено, так как заголовок изменяется, но не цвета.

ВАЖНО : нет другого кода, в котором backgroundColor явно изменен, а метод didSelectRowAt даже не реализован. Когда ячейка выбрана, backgroundColor ее подпредставлений автоматически обновляется, поэтому в данный момент я меняю цвет, выбирая ячейку.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Обновлено: Вместо использования свойства UIButton backgroundColor вы действительно хотите использовать setBackgroundImage(_:for:). Вы можете использовать расширение в UIImage ( пример расширения здесь ), чтобы создать изображение из цвета, и это должно хорошо работать для того, что вы пытаетесь сделать.

Ваш полученный код конфигурации должен выглядеть примерно так:

button1.setBackgroundImage(.image(with: .red), for: .normal)
0 голосов
/ 30 августа 2018

На самом деле, проблема в том, что он сделал. Установите, чтобы вы добавили цвет, поэтому при его изменении он останется таким же, как и вы

 override var backgroundColor: UIColor? {
    didSet {
        button1.backgroundColor = backgroundColor
        button2.backgroundColor = backgroundColor
    }
}
...