ios13 Изменение темного режима не распознается ячейкой tableview? - PullRequest
1 голос
/ 09 октября 2019

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

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

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

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

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)

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

Привет

Ответы [ 2 ]

4 голосов
/ 09 октября 2019

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

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

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

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

0 голосов
/ 10 октября 2019

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


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

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

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

...