2017-07-31 68 views
6

W aplikacji, nad którą właśnie pracuję, istnieje zagnieżdżona konfiguracja widoku kolekcji. Zewnętrzny widok kolekcji zawiera duże komórki, które można przewijać w pionie, a każda komórka zawiera inny widok kolekcji z mniejszymi komórkami (układ w widokach pod-kolekcji różni się, dlatego istnieje wiele takich).Tworzenie zagnieżdżonych widoków kolekcji z dużymi komórkami dostępnymi za pomocą VoiceOver

Wizualnie wszystko działa dobrze, ale natknąłem się na problem z Voice Over: Kiedy dotarłem do ostatniego elementu w pierwszym widoku kolekcji dzieci (tj. Ostatni element pierwszej komórki z zewnętrznego widoku kolekcji), Nie mogę wybrać następnego elementu, przesuwając. Zamiast tego system iOS wydaje dźwięk tak, jakby ostatni element został osiągnięty.

Potrafię przeciągnąć trzema palcami, aby przewinąć w dół, a następnie wybrać następny element, ale oczywiście nie powinno to być konieczne. Wybór ostatniego elementu i powrót do tyłu w odwrotnej kolejności działa zgodnie z przeznaczeniem.

Problem pojawia się tylko wtedy, gdy początkowo widoczna jest tylko jedna komórka (zewnętrznego widoku kolekcji). Jeśli wiele komórek jest widocznych, wszystko działa. Nie mogę jednak zmienić rozmiarów zewnętrznych komórek, ponieważ to całkowicie zmieni układ.

Utworzono przykładowy kontroler widoku poniżej, który pokazuje problem. Dwa widoki kolekcji w projekcie są takie same, z wyjątkiem rozmiarów komórek. Pierwszy widok kolekcji z mniejszymi komórkami działa zgodnie z oczekiwaniami. Drugi nie (podczas przesuwania, aby wybrać następną komórkę, system iOS odtwarza dźwięk "beep", gdy wybrana została ostatnia widoczna komórka, mimo że w dalszej komórce jest więcej).

Więc moje pytanie brzmi:

  • Jak mogę sprawić, że drugi widok kolekcja zachowywać się jak pierwszy?
  • Jak mogę powiększyć komórki w dół w drugim widoku kolekcji dostępnym poprzez przesuwanie w poziomie?

Solutions próbowałem dotąd:

  • jeden tak postu sugeruje tworzenia widoku otoczka do zagnieżdżonych widoki zbiórki. To chyba nie robi różnicy.
  • Próbowałem samodzielnie wdrożyć protokół UIAccessibilityContainer w niestandardowej podklasie widoku kolekcji. To wydaje się przerywać przewijanie w dziwny sposób.
  • Wprowadzanie "układ zmienił" powiadomienia w przypadkowych miejscach, aby zobaczyć, czy to pomaga (to nie)

Edit: Pełny kod z ViewController który demonstruje problem:

class ViewController: UIViewController, UICollectionViewDataSource { 
    let outerCollectionView = UICollectionView(frame: CGRect(x: 0, y: 40, width: 320, height: 250), collectionViewLayout: UICollectionViewFlowLayout()) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = .green 
     outerCollectionView.backgroundColor = .blue 

     (outerCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = CGSize(width: 250, height: 300) 
     outerCollectionView.register(OuterCell.self, forCellWithReuseIdentifier: "outerCell") 
     view.addSubview(outerCollectionView) 
     outerCollectionView.dataSource = self 
    } 

    func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 4 } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "outerCell", for: indexPath) as! OuterCell 
     cell.outerIndex = indexPath.row + 1 
     return cell 
    } 
} 

class OuterCell: UICollectionViewCell, UICollectionViewDataSource { 
    var innerCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 300, height: 500), collectionViewLayout: UICollectionViewFlowLayout()) 
    var outerIndex: Int = 0 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     (innerCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = CGSize(width: 140, height: 80) 
     innerCollectionView.backgroundColor = .yellow 
     innerCollectionView.register(InnerCell.self, forCellWithReuseIdentifier: "innerCell") 
     contentView.addSubview(innerCollectionView) 
     innerCollectionView.dataSource = self 
    } 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("unused") 
    } 
    func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "innerCell", for: indexPath) as! InnerCell 
     cell.label.text = "Cell \(outerIndex)/\(indexPath.item+1)" 
     return cell 
    } 
} 

class InnerCell: UICollectionViewCell { 
    let label = UILabel(frame: CGRect(origin: .zero, size: CGSize(width: 100, height: 30))) 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     contentView.backgroundColor = .white 
     contentView.addSubview(label) 
    } 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("unused") 
    } 
} 

Edycja: Oto film pokazujący problem: https://vimeo.com/229249955 (Zauważ, że dodałem tam trochę opisu).

+0

Czy możesz umieścić swój kod tutaj zamiast zewnętrznego źródła? –

+0

Mogę opublikować kod kontrolera widoku, ale bez scenorysu nie będzie to zbyt użyteczne. Czy mimo to powinienem to opublikować? – jasamer

+0

Wysyłając post na Przekroczenie stosu, spróbuj opublikować [Minimalny, kompletny i możliwy do zweryfikowania przykład] (https://stackoverflow.com/help/mcve) –

Odpowiedz

2

Z tego co zrozumiałem, nie można przewinąć do następnej komórki w widoku kolekcji zewnętrznej po osiągnięciu ostatniej komórki w widoku kolekcji wewnętrznej. Ale jednak działa trzema palcami.

Dzieje się tak z powodu właściwości Odbijanie w widoku kolekcji. Spróbuj wyłączyć właściwość Odbijanie w widoku kolekcji wewnętrznej.

W powyższym kodzie, dodaj następujący wiersz kodu w metodzie init OuterCell.

innerCollectionView.bounces = false 
+0

Jak się wydaje, wyłączenie odbicia niczego nie zmieniło. Nadal dostaję "sygnał dźwiękowy", gdy docieram do trzeciej komórki. – jasamer

+0

@jasamer można przesłać wideo z problemem i udostępnić link? – Srinivasan

+0

Dodałem film wideo do pytania (https://vimeo.com/229249955). – jasamer