Как остановить мигание UITableViewCell на белый при отмене выбора? - PullRequest
1 голос
/ 30 мая 2019

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRow(at: index, animated: animated)
    }
}

Это приводит к этому непреднамеренному и резкому переходу, при котором отменившая выборка ячейка затемняет свой фон, прежде чем вернуться к нормальной жизни:

jarring animation

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

(Ячейка находится в стадии разработки - она ​​далеко не закончена)

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

В ответ на вопрос Рико, ячейка создается как пара .swift и .xib, иерархия представлений:

Interface Builder view hierarchy

Swift делает очень мало - устанавливает .textInsets на две метки, рисует индикатор раскрытия в кнопке.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вместо deselecting row в viewWillAppear(_:), вызовите deselectRow(at:animated:) в методе tableView(_:didSelectRowAt:), т.е.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    //Your rest of the code...
}

Edit-1:

В viewWillAppear(_:) необходимо deselect cell в UIView.animate(withDuration:animations:) с animation, установленным на true в deselectRow(at:animated:), т. Е.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIView.animate(withDuration: 0.2) {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            self.tableView.deselectRow(at: indexPath, animated: true)
        }
    }
}
0 голосов
/ 30 мая 2019

Я считаю, что это потому, что стандартная реализация setSelected удаляет цвет фона всех подпредставлений ячейки.То, что вы можете сделать, это переопределить setSelected и / или setHighlighted и обновить ячейку самостоятельно.

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

Пример, который используеткрасный фон, если выбран, и белый, если не выбран:

override func setSelected(_ selected: Bool, animated: Bool) {
    let animationDuration = animated ? 0.3 : 0
    UIView.animate(withDuration: animationDuration) {
      self.backgroundColor = highlighted ? UIColor.red : UIColor.white
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...