2016-05-31 16 views
3

Ich versuche, iOS-Barrierefreiheit Unterstützung/Voice Over meiner App hinzuzufügen. Mein Hauptbildschirm verfügt über drei Hauptsteuerelemente, aber das dritte Steuerelement befindet sich in einem integrierten Ansichtscontroller.Einstellung view.accessibilityElements mit eingebetteten View-Controllern

Ich stelle Barrierefreiheit Elemente in prepareForSegue und haben bestätigt, dass die eingebetteten Ansicht Controller-Steuerelemente alle geladen sind. Problem ist, dass ich immer noch nur die ersten beiden Steuerelemente auswählen kann, die sich im umgebenden View-Controller befinden.

self.view.accessibilityElements = 
    @[ 
     self.cmdMenu,      // works 
     self.collectionView,    // works 
     self.childViewController.peerMenu // doesn't work 
    ]; 

Alle drei Ansichten haben isAccessibilityElement = YES.

Fehle ich etwas? Ich kann mir nicht vorstellen, dass die Accessibility-Elemente im selben View-Controller eingeschränkt sind.

+0

was sind die Ansichten? Gibt es noch andere Unterschiede? Wenn Sie die Sammlungsansicht aus dem Array entfernen, gibt es ein anderes Ergebnis? – Wain

+0

Beide Menüansichten sind Instanzen eines von mir erstellten Steuerelements.Wenn ich die CollectionView von den accessibilityElements entferne, dann ist nur das cmdMenu verfügbar. –

Antwort

3

Ich habe meinen Fehler gefunden und arbeite jetzt mit Voice Over. Dabei habe ich eine Reihe von Dingen herausgefunden, die ich gerne teilen würde.

  1. Zu meiner ursprünglichen Frage können Sie Steuerelemente in Ihrem Kind Ansicht Controller von Ihrem Hauptansicht Controller verweisen. Sie können die Steuerelemente direkt hinzufügen (wie in meiner Frage) oder Sie können alle Elemente für die Barrierefreiheit im untergeordneten Ansichtscontroller mithilfe von self.view.accessibilityElements = @[ _control1, childViewController.view, childViewController2.view] hinzufügen.
  2. Wenn Sie alle Steuerelemente in Ihrem untergeordneten Ansichtscontroller wie in (1.) hinzufügen, stellen Sie sicher, dass childViewController.view.isAccessibilityElement = NO.
  3. Sie können jedem AccessibilityElements ein beliebiges Objekt hinzufügen, auch Elemente, die keine Informationen zur Barrierefreiheit enthalten. Die API wird dich nicht bestätigen oder warnen. Das war mein Fehler.
  4. Wenn sich Ihre Benutzeroberfläche ändert und Sie die Anzahl oder Reihenfolge der Elemente in Ihrem accessibilityElements-Array ändern müssen, informieren Sie UIKit über UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self). Das Benachrichtigungsargument (wo ich self sende) teilt Voice Over mit, wo es seinen Cursor positionieren soll, wenn die Benachrichtigung abgeschlossen ist.
  5. Wenn Sie einen Text für eine vorübergehende Benachrichtigung vorlesen möchten (stellen Sie sich vor, wenn Clash Of Clans Ihnen sagt, wie viele Edelsteine ​​Sie in diesem Baumstumpf gefunden haben), rufen Sie UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText) an. Ein Vorbehalt, der Text wird nicht laut vorgelesen, es sei denn, es wird keine weitere Voice Over ausgeführt. Sie müssen das Timing selbst verwalten. Einen Bug hierüber eingereicht. Apple könnte das viel besser machen. Wenn Sie UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, messageText) verwenden, können Sie nach UIAccessibilityAnnouncementDidFinishNotification hören, aber leider hat diese Benachrichtigung fast keinen Wert Sie werden nur benachrichtigt, wenn Ihr Nachrichtentext vollständig gesprochen wurde. Es sagt Ihnen nicht, dass es gesprochen, aber unterbrochen wurde, und es wird auch nicht für irgendeinen Text ausgelöst, der durch das UIKit-Framework gesprochen wird.
  6. Der Accessibility Inspector im iOS Simulator saugt irgendwie. Wenn Ihre Einstellungen für die Barrierefreiheit richtig sind, kann Ihnen das sagen, was dort ist. Wenn Sie ein Problem haben, gibt Ihnen der Inspector keine Informationen darüber, was falsch ist. Dies gilt für die gesamte UIAccessibility-API. Es ist so einfach zu bedienen, dass es fast immer funktioniert. Aber wenn es nicht funktioniert, müssen Sie auf Jagd und Picken zurückgreifen, um es herauszufinden. Die API benötigt einige Assertions oder Konsolenmeldungen, ähnlich wie Apple Constraint-Warnungen verarbeitet. Spoileralarm: Der Accessibility Inspector in Xcode 8 ist wayyyyy besser, hätte aber bei meinem Problem nicht geholfen.
  7. Es gibt eine Menge guter Informationen in der UIAccessibility.h Header. Wenn Sie mit der Unterstützung von UIAccessibility beginnen, ist das ein guter Lesevorgang.
+0

Ausgezeichnete write-up! Dies verursachte Tonnen von Problemen in unseren XCUIT-Tests, insbesondere nicht mit "UIAccessibilityPostNotification (UIAccessibilityLayoutChangedNotification, self)", da die Zugriffshierarchie schnell veraltet ist. –