Изменение темного режима ios13 не распознается ячейкой tableview?

Я проверяю, что мое существующее приложение правильно работает с новой представленной функцией темного режима в ios 13.

Кажется, все работает нормально, только фон ячейки в одном из моих tableViews не обновляется в соответствии с режимом (темный / светлый).

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

для ячеек tableview я использую следующую функцию для градиента:

func gradient(frame:CGRect) -> CAGradientLayer { 

    let gradColor1 = UIColor(named: "gradientBright")!
    let gradColor2 = UIColor(named: "gradientDark")!

    let layer = CAGradientLayer()
    layer.frame = frame
    layer.startPoint = CGPoint(x: 0.5, y: 0)
    layer.endPoint = CGPoint(x: 0.5, y: 1)
    layer.colors = [
        gradColor1.cgColor,
        gradColor2.cgColor
    ]
    layer.shadowOpacity = 0.7
    layer.shadowRadius = 10.0
    return layer
}

я добавляю градиентный фон в ячейки таблицы в

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

со следующим кодом

cell.layer.insertSublayer(gradient(frame: cell.bounds), at: 0)

Любая идея, почему только функция градиента, похоже, не получает правильные цвета после изменения режима, когда приложение активно или в фоновом режиме?

С Уважением


person MadMaxAPP    schedule 09.10.2019    source источник
comment
Добавление слоя в эту функцию приводит к дублированию слоев. Добавляйте слой только в том случае, если он еще не был добавлен ранее.   -  person Mojtaba Hosseini    schedule 10.10.2019
comment
У меня была эта проблема раньше, я отправляю ответ со ссылкой на мою проблему. Проверьте это и дайте мне знать, если у вас возникнут дополнительные вопросы.   -  person Mojtaba Hosseini    schedule 10.10.2019


Ответы (2)


Cell обнаружит, layer нет! Например, вы должны вручную обновить все layer адаптации в cell.

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        removeAndReaddGradientIfNeeded()
    }
}

Подробное описание здесь

person Mojtaba Hosseini    schedule 09.10.2019
comment
и это нужно сделать (начальное добавление и замена) в uitableviewcell? Невозможно сделать так, чтобы градиентный слой был добавлен с правильным размером (self.bounds, self.contentView.bound, а также self.backgroundView.bounds кажутся меньше, чем ширина дисплея) - person MadMaxAPP; 13.10.2019
comment
Ага. layoutSubviews - это функция, которую необходимо переопределить для пересчета размера при его изменении. - person Mojtaba Hosseini; 13.10.2019

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


override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
  super.traitCollectionDidChange(previousTraitCollection)

  if traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle {
    // reload the gradient layer to react
  }
}

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

person Procrastin8    schedule 09.10.2019
comment
Можете ли вы в конце концов указать мне, как добавить слой градиента в uitableviewcell и убедиться, что он добавляется только один раз? Не знал об этой проблеме, так как во всех руководствах и документации мне было сказано добавить ее в класс uitableview. - person MadMaxAPP; 13.10.2019