2016-08-08 41 views
0

Ich füge meiner iOS-App die Unterstützung für Eingabehilfen hinzu und habe Probleme mit einer Auflistungsansicht in einer meiner Tabellenansichtszellen.UICollectionView in einer UITableViewCell mit Barrierefreiheit

Wenn der Benutzer zum Beispiel (horizontal) von der ersten Zelle zur zweiten Zelle scrollt, liest Accessibility immer noch den Inhalt der ersten Zelle. Wenn ich versuche, in der zweiten Zelle auf eine Ansicht zu tippen, wird links neben der zweiten Zelle (wo die erste Zelle nicht mehr sichtbar wäre) ein leerer Platz hervorgehoben und der Inhalt der ersten Zelle gelesen.

Wenn die Sammlungsansicht nicht in einer Tabellenansichtszelle ist (d. H. Eine Unteransicht einer UIView), geschieht dies nicht.

Ich vermute, das hat etwas mit dem Aufruf UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification) zu tun und ich habe versucht, es an vielen verschiedenen Orten, aber nichts hat funktioniert.

Die folgenden zwei Screenshots zeigen eine Sammlungsansicht in einer UIView. Die Eingabehilfe ist aktiviert, daher wird sie beim Tippen mit einem schwarzen Rand ausgewählt.

  1. Wenn der Benutzer die erste Zelle antippt, wird diese ausgewählt.

  1. Wenn der Benutzer Taps 'Next', in die zweite Zelle geht, und tippt die Zelle, wird die neue Zelle ausgewählt bekommen.

Die nächsten beiden Bilder zeigen die Auflistungsansicht in einer Ansicht Zellentabelle.

Wenn der Benutzer auf die erste Zelle tippt, wird diese ausgewählt und VoiceOver liest korrekt "I'm label 0".

Wenn jedoch die ‚Next‘ Benutzer Hähnen, in die nächste Zelle geht, und tippt die zweite Zelle, wird es nicht ausgewählt und Voiceover wird noch lesen: „Ich bin Label 0“.

Der Code ist here on github verfügbar.

Antwort

0

können Sie wollen, dies versuchen:

let nextCell = collectionView.cellForItemAtIndexPath(nextIndexPath) 
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, 
           argument: nextCell) 

in Ihrem onNextButtonTapped Verfahren, nach dem Aufruf von scrollToItemAtIndexPath.

Dadurch wird die Eingabehilfe für die nächste Zellengruppe der Sammlungsansicht aktiviert.

+0

Ich habe dies versucht und obwohl es die neue Zelle liest, wenn es erscheint, wird durch erneutes Antippen der Zelle die vorherige Zelle ausgewählt. – ykay

+0

Ich glaube, vor iOS 10 gibt es ein Problem mit Scroll-Ansichten, die den 'accessibilityFrame' nicht automatisch aktualisiert. Ich bin mir der Details nicht sicher, aber vielleicht möchten Sie sich das genauer ansehen. Ihre Screenshots zeigen, dass der Frame immer noch auf die erste Zelle fokussiert ist. Ist das der Fall mit dem modifizierten Code? – stevekohls

+0

Wenn UIAccessibilityScreenChangedNotification angezeigt wird, wird die zweite Zelle richtig ausgewählt (und VoiceOver liest "I'm Label 1" aus). Bei weiteren Interaktionen wird jedoch immer die erste Zelle erneut ausgewählt. – ykay

2

Ich hatte simillar Problem, das ich schließlich gelöst. Ich denke, dass Sie nicht übereinstimmen Elemente mit

isAccessibilityElement=true 

übereinander haben.

Ich habe eine Tabellenansicht, die vertikal scrollt und jede Zelle enthält eine Titel- und Sammlungsansicht, die horizontal scrollt.

Ich set IsAccessibilityElement auf True nur für Titel und Sammlung View-Zellen, falsch auf den Rest.

Dann subclassed ich UICollectionView und overrided folgende NSObject Methoden:

func accessibilityElementCount() -> Int 
func accessibilityElement(at: Int) -> Any? 
func index(ofAccessibilityElement element: Any) -> Int 

Es im Grunde sagt, nur die Stimme über, dass Ihre Sammlung Ansicht Auch diese zugänglichen Elemente hat. Die Sammelansicht selbst ist nicht zugänglich, was kein Problem ist, im Gegenteil. Sie könnten wahrscheinlich

open var accessibilityElements: [Any]? 

stattdessen verwenden.

Hier einige weitere Lesung aus Dokumentation (UIAccessibility.h):

UIAccessibilityContainer Methoden außer Kraft gesetzt werden können einzelne Elemente andere Dinge verkauft, die von einem einzigen UIView verwaltet werden.

Zum Beispiel könnte ein einzelnes UIView mehrere Elemente zeichnen, die (für einen Endbenutzer) unterschiedliche Bedeutung und Funktionalität haben. Es ist wichtig, jedes Element als ein einzelnes Zugänglichkeitselement zu verkaufen.

Unterelemente eines Containers, die nicht durch konkrete UIView Instanzen dargestellt werden (z. B. gemalte Texte oder Symbole), können mit Instanzen der UIAccessibilityElement-Klasse dargestellt werden (siehe UIAccessibilityElement.h).

Eingabehilfen müssen NEIN an -isAccessibilityElement zurückgeben.

Um schöne 3-Finger-Voice-over erlauben scrollen Sie wahrscheinlich

func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool 

auch und blättern Sie Ihre Sammlung Ansicht entsprechend außer Kraft setzen möchten.

+0

Es wäre toll, wenn Sie die Quelle Ihres Angebots verknüpft. (Und Einfügen '>' am Anfang anstelle von vier Leerzeichen wird es als Zitat anstelle eines Codeblocks formatieren.) – wkl

+0

Arbeitete für mich !, @ykay sollte es akzeptiert werden beantworten –