Отключить VoiceOver для выбора UIButton / UITableViewCell / UICollectionViewCell

Когда VoiceOver включен, когда фокус переходит на _1 _ / _ 2 _ / _ 3_, VoiceOver считывает его метку доступности один раз.

Затем, как только пользователь дважды коснется этого _4 _ / _ 5 _ / _ 6_, VoiceOver снова прочитает ту же метку доступности, помимо выполнения действий (навигации и т. Д.) При выборе _7 _ / _ 8 _ / _ 9_.

Я много искал, но не смог найти способ остановить / отключить метку доступности чтения VoiceOver при выборе _10 _ / _ 11 _ / _ 12_.

Любая помощь будет высоко ценится.


person Maverick    schedule 10.05.2016    source источник
comment
Вы когда-нибудь находили на это ответ? Я столкнулся с той же проблемой.   -  person Jan    schedule 22.02.2017
comment
Приносим извинения за задержку с ответом. Я справился с этим путем принудительного выбора другого элемента доступности. Например, после выбора из TableView / CollectionView я должен перейти к новому пользовательскому интерфейсу. Что я делаю, так это то, что я принудительно выбираю кнопку левой панели на панели навигации нового пользовательского интерфейса сразу после завершения навигации. Выбор осуществляется с помощью UIAccessibilityPostNotification. Таким образом, он начинает читать только что выбранный элемент. См. Эту ссылку для выбора   -  person Maverick    schedule 05.03.2017


Ответы (2)


Swift 5

Что сработало для меня, так это установка myElementIWantSilent.accessibilityTraits = .none

РЕДАКТИРОВАТЬ: я должен отметить, что они также присутствуют:

viewContainingSilentElement.isAccessibilityElement = true
viewContainingSilentElement.accessibilityTraits = .image
viewContainingSilentElement.accessibilityLabel = "some text i want read aloud"

iPhone 8
iOS 14.5.1
XCode 12.5

person Mark    schedule 17.05.2021

Давайте посмотрим, как остановить чтение специальных возможностей VoiceOver для элементов UIButton и UITableViewCell.

UIBUTTON: просто создайте свой собственный класс кнопки и переопределите _ 3_ метод.

class BoutonLabelDoubleTap: UIButton {

    override func accessibilityActivate() -> Bool {
        accessibilityLabel = ""
        return true
    }
}

UITABLEVIEWCELL: необходимо выполнить два шага.

  • Создайте собственный UIAccessibilityElement, переопределяющий метод accessibilityActivate .

    class TableViewCellLabelDoubleTap: UIAccessibilityElement {
    
        override init(accessibilityContainer container: Any) {
            super.init(accessibilityContainer: container)
        }
    
        override var accessibilityTraits: UIAccessibilityTraits {
            get { return UIAccessibilityTraitNone }
            set {   }
        }
    
        override func accessibilityActivate() -> Bool {
            accessibilityLabel = ""
            return true
        }
    }
    
  • Используйте созданный ранее класс для реализации ячеек табличного представления в контроллере представления.

    class TestButtonTableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
    
        @IBOutlet weak var myTableView: UITableView!
        @IBOutlet weak var bottomButton: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            myTableView.delegate = self as UITableViewDelegate
            myTableView.dataSource = self as UITableViewDataSource
        }
    
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
    
        func tableView(_ tableView: UITableView,
                       numberOfRowsInSection section: Int) -> Int {
            return 2
        }
    
        func tableView(_ tableView: UITableView,
                       cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
            let zeCell = tableView.dequeueReusableCell(withIdentifier: "myPersoCell",
                                                       for: indexPath)
    
            zeCell.accessibilityElements = nil
            var elements = [UIAccessibilityElement]()
    
            let a11yEltCell = TableViewCellLabelDoubleTap(accessibilityContainer: zeCell)
            a11yEltCell.accessibilityLabel = "cell number " + String(indexPath.row)
            a11yEltCell.accessibilityFrameInContainerSpace = CGRect(x: 0,
                                                                    y: 0,
                                                                    width: zeCell.contentView.frame.size.width,
                                                                    height: zeCell.contentView.frame.size.height)
            elements.append(a11yEltCell)
            zeCell.accessibilityElements = elements
    
            return zeCell
        }
    }
    

Я не пробовал использовать UICollectionViewCell, но это должно быть такое же обоснование, что и UITableViewCell.

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

person XLE_22    schedule 15.04.2019
comment
Как мы можем остановить голос более 1 из 10, 2 из 10 и т. Д. Столкнувшись с проблемой в UIPickerView, где всегда отображается 1 из 10, когда мы проводим пальцем по любому элементу - person Nishchith; 30.06.2021
comment
@Nishchith Я не уверен, что вы слушаете 1 больше x для каждой ячейки в этом примере прокручиваемого представления, который я предоставил, не так ли? (уже более 2 лет ⏳) Я не проводил никаких тестов с представлением выбора, и единственный ответ, который я предоставил, - stackoverflow.com/ a / 61018428/3825084, извините. - person XLE_22; 30.06.2021
comment
Конечно, спасибо. Я столкнулся с проблемой того, что текущий индекс не озвучивается должным образом. Когда я смахиваю, всегда отображается 1 от общего числа. Вы хоть представляете, как мы можем полностью отключить голосовое сопровождение только тогда, когда происходит смахивание по экрану? Об установке моей собственной метки доступности. Он озвучивает текст метки доступности, а затем также текст по умолчанию. stackoverflow.com/questions/68183280/ - person Nishchith; 01.07.2021