Элемент UIAccessibilityElement с функцией кнопки, добавляющей «один из одного» после того, как голос за кадром говорит о кнопке

#ios #swift #accessibility #voiceover

#iOS #swift #Специальные возможности #голос за кадром

Вопрос:

Я использую UIAccessibilityElement для инкапсуляции информации из нескольких меток и кнопок в пользовательскую UITableViewCell. Когда голос за кадром включен и пользователь проводит пальцем по каждому элементу, я хочу, чтобы определенные элементы были сгруппированы вместе. Например, вместо того, чтобы произносить «Любимое блюдо», пользователь должен снова провести пальцем, чтобы услышать «Пицца», он будет произносить «Любимое блюдо, пицца».

В моей подклассовой ячейке это работает путем переопределения accessibilityElements. Однако у меня возникает проблема, когда я добавляю UIButton в accessibilityElements. В приведенном ниже коде я создаю viewProfileButtonAccessibilityElement. Я добавляю ярлык доступности и признак .кнопка. При произнесении голосом за кадром он говорит «Кнопка просмотра изображения профиля одна из одной». Я не могу понять, откуда берется «один из одного». Есть идеи, что заставляет голос за кадром добавлять «один из одного» после произнесения слова button?

   private var cachedAccessiblityElements: [Any]?

  override var accessibilityElements: [Any]? {
    set {
      cachedAccessiblityElements = newValue
    }
    get {
      // Return the acessibility elements if we've already created them
      if let cachedAccessiblityElements = cachedAccessiblityElements {
        return cachedAccessiblityElements
      }

      var elements = [UIAccessibilityElement]()

      if let favoriteFoodTitle = favoriteFoodTitle.text, let favoriteFood = favoriteFood.text {
        let favoriteFoodAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
        favoriteFoodAccessibilityElement.accessibilityLabel = favoriteFoodTitle   " "   favoriteFood
        favoriteFoodAccessibilityElement.accessibilityFrameInContainerSpace = self.favoriteFoodTitle.frame.union(self.favoriteFood.frame)
        elements.append(favoriteFoodAccessibilityElement)
      }

      let viewProfileButtonAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self)
      viewProfileButtonAccessibilityElement.accessibilityLabel = "View Profile Picture"
      viewProfileButtonAccessibilityElement.accessibilityTraits = UIAccessibilityTraits.button
      viewProfileButtonAccessibilityElement.accessibilityFrameInContainerSpace = self.viewProfileButton.frame
      elements.append(viewProfileButtonAccessibilityElement)

      cachedAccessiblityElements = elements
      return cachedAccessiblityElements
    }
  }
  

Ответ №1:

Я не могу понять, откуда берется «один из одного». Есть идеи, что заставляет голос за кадром добавлять «один из одного» после произнесения слова button?

Каждая кнопка UIControl, которую вы создаете в ячейке с .button признаком, будет озвучена так, как вы упомянули.

Независимо от количества созданных кнопок в tableviewcell, все они будут озвучены одним и тем же суффиксом, указывающим ячейку, к которой они принадлежат, и общее количество ячеек в разделе.

«один из одного» в вашем примере означает, что ваша кнопка находится в первой ячейке и что у вас есть только одна ячейка в вашем разделе.

Например, если вы создадите две кнопки в третьей ячейке раздела, содержащего десять ячеек, вы услышите суффикс «три из десяти» для ваших двух кнопок.

Я надеюсь, что это объяснение достаточно четкое, чтобы понять, откуда взялось ваше «один из одного», как это требуется.