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).
Czy możesz umieścić swój kod tutaj zamiast zewnętrznego źródła? –
Mogę opublikować kod kontrolera widoku, ale bez scenorysu nie będzie to zbyt użyteczne. Czy mimo to powinienem to opublikować? – jasamer
Wysyłając post na Przekroczenie stosu, spróbuj opublikować [Minimalny, kompletny i możliwy do zweryfikowania przykład] (https://stackoverflow.com/help/mcve) –