2017-07-31 17 views
6

Trong ứng dụng mà tôi hiện đang làm việc, có một thiết lập chế độ xem bộ sưu tập lồng nhau. Chế độ xem bộ sưu tập bên ngoài chứa các ô lớn có thể cuộn dọc và mỗi ô chứa một chế độ xem bộ sưu tập khác với các ô nhỏ hơn (bố cục trong các tập hợp con khác nhau, đó là lý do tại sao có nhiều ô). Một cách trực quan, mọi thứ hoạt động tốt, nhưng tôi đã gặp phải vấn đề với Voice Over: Khi tôi đến mục cuối cùng trong chế độ xem bộ sưu tập con đầu tiên (ví dụ: mục cuối cùng của ô đầu tiên của chế độ xem bộ sưu tập bên ngoài), Tôi không thể chọn mục tiếp theo bằng cách vuốt. Thay vào đó, iOS làm cho âm thanh như thể mục cuối cùng đã đạt được.Tạo chế độ xem bộ sưu tập lồng nhau với các ô lớn có thể truy cập bằng VoiceOver

Tôi có thể vuốt ba ngón tay để cuộn xuống và sau đó chọn phần tử tiếp theo, nhưng điều này rõ ràng là không cần thiết. Chọn phần tử cuối cùng và sẽ sao lưu theo thứ tự ngược hoạt động như dự định.

Sự cố chỉ xảy ra khi chỉ có một ô (trong chế độ xem bộ sưu tập bên ngoài) hiển thị ban đầu. Nếu có nhiều ô hiển thị, mọi thứ sẽ hoạt động. Tuy nhiên, tôi không thể thay đổi kích thước của các ô bên ngoài, bởi vì điều đó sẽ thay đổi hoàn toàn bố cục.

Tôi đã tạo bộ điều khiển chế độ xem mẫu bên dưới minh họa sự cố. Hai khung nhìn bộ sưu tập trong dự án là như nhau, ngoại trừ kích thước của các ô. Chế độ xem bộ sưu tập đầu tiên với các ô nhỏ hơn hoạt động như mong đợi. Người thứ hai không (khi vuốt để chọn ô tiếp theo, iOS phát âm "bíp" khi ô hiển thị cuối cùng được chọn, mặc dù có nhiều ô hơn nữa).

Vì vậy, câu hỏi của tôi là:

  • Làm thế nào tôi có thể làm cho xem bộ sưu tập thứ hai cư xử như là người đầu tiên?
  • Làm cách nào để làm cho các ô tiếp tục xuống trong chế độ xem bộ sưu tập thứ hai có thể truy cập thông qua vuốt ngang?

Solutions tôi đã cố gắng cho đến nay:

  • Một SO bài đề nghị tạo ra một cái nhìn wrapper cho các quan điểm bộ sưu tập lồng nhau. Điều này dường như không tạo ra sự khác biệt nào.
  • Tôi đã cố gắng tự triển khai giao thức UIAccessibilityContainer trong một lớp con tùy chỉnh của chế độ xem bộ sưu tập. Điều này dường như phá vỡ cuộn theo những cách kỳ lạ.
  • Đổ "bố trí thay đổi" thông báo ở những nơi ngẫu nhiên để xem nếu nó giúp (nó không)

Edit: Full mã của một ViewController đó chứng tỏ vấn đề:

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") 
    } 
} 

Chỉnh sửa: Dưới đây là video hiển thị sự cố: https://vimeo.com/229249955 (Lưu ý rằng tôi đã thêm một chút mô tả ở đó).

+0

Bạn có thể đăng mã của mình tại đây thay vì tài nguyên bên ngoài không? –

+0

Tôi có thể đăng mã của bộ điều khiển chế độ xem nhưng nó không được sử dụng nhiều nếu không có bảng phân cảnh. Tôi có nên đăng nó không? – jasamer

+0

Khi đăng trên Stack Overflow, hãy thử đăng một [Minimal, Complete và Verifiable example] (https://stackoverflow.com/help/mcve) –

Trả lời

2

Từ những gì tôi hiểu vấn đề là bạn không thể cuộn đến ô kế tiếp trong chế độ xem bộ sưu tập ngoài khi bạn đã đến ô cuối cùng trong chế độ xem bộ sưu tập bên trong. Tuy nhiên, một thao tác vuốt ba ngón tay sẽ hoạt động.

Điều này là do thuộc tính thoát trên chế độ xem bộ sưu tập. Hãy thử tắt thuộc tính thoát trên chế độ xem bộ sưu tập bên trong.

Trong đoạn mã trên, thêm dòng mã sau vào phương thức init OuterCell.

innerCollectionView.bounces = false 
+0

Tắt thư bị trả lại không thay đổi bất cứ điều gì, có vẻ như vậy. Tôi vẫn nhận được "tiếng bíp" khi tôi đến được phòng giam thứ ba. – jasamer

+0

@jasamer bạn có thể tải lên video về sự cố và chia sẻ liên kết không? – Srinivasan

+0

Tôi đã thêm video vào câu hỏi (https://vimeo.com/229249955). – jasamer

Các vấn đề liên quan