#ios #swift #accessibility #voiceover
#iOS #swift #Специальные возможности #voiceover
Вопрос:
У меня возникли некоторые проблемы с исправлением voiceover после удаления строки. структура такая:
У меня есть tableview с 2 разделами.
- Первый раздел получил заголовок height = 0 и только одну строку переменной высоты.
- Второй раздел получил заголовок фиксированной высоты с кнопкой внутри; строк в этих разделах может быть ‘n’. Когда пользователь нажимает кнопку внутри заголовка, ячейка в первом разделе удаляется или вставляется повторно в соответствии с предыдущим состоянием.
В обычном «состоянии» с развернутой ячейкой voiceover работает отлично. Когда пользователь нажимает на кнопку и удаляет строку в первом разделе, voiceover прерывается. Если я просматриваю сверху вниз, все в порядке. Вместо этого при прокрутке вверх vo считывает ячейки, видимые на экране, но читает заголовок первого раздела перед ячейками под ним.
Вставить и удалить довольно просто:
let indexPath = IndexPath(row: 0, section: 0)
if isExpanded {
if tableView.contentOffset.y <= 0 {
tableView.insertRows(at: [indexPath], with: .automatic)
} else {
tableView.reloadData()
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
} else {
tableView.deleteRows(at: [indexPath], with: .automatic)
}
ячейки в каждом разделе имеют: isAccessibilityElement = false
элементом доступности является карточка внутри ячейки, подобная этой:
cardView.isAccessibilityElement = true
cardView.accessibilityTraits = .button
Я был бы очень признателен за вашу помощь, я пробовал разные решения, но ни одно из них не работает. Это в значительной степени головная боль!
Дайте мне знать, если вам нужна дополнительная информация для решения этой проблемы. Спасибо.
Ответ №1:
Решил это, всегда сохраняя строку в первом разделе.
tableView.performBatchUpdates({
tableView.deleteRows(at: [indexPath], with: .fade)
tableView.insertRows(at: [indexPath], with: .fade)
}, completion: nil)
Но когда переменная IsExpanded имеет значение false, высота строк в первом разделе устанавливается равной 0 вместо автоматической.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
return isExpanded ? UITableView.automaticDimension : 0
}
return UITableView.automaticDimension
}