के साथ सुलभ बड़ी कोशिकाओं के साथ नेस्टेड संग्रह दृश्य बनाएं, जिस ऐप पर मैं वर्तमान में काम कर रहा हूं, वहां एक नेस्टेड संग्रह दृश्य सेटअप है। बाहरी संग्रह दृश्य में बड़ी कोशिकाएं होती हैं जो लंबवत स्क्रॉल करने योग्य होती हैं, और प्रत्येक कक्ष में छोटे कक्षों के साथ एक और संग्रह दृश्य होता है (उप-संग्रह-दृश्य में लेआउट भिन्न होता है, यही कारण है कि कई हैं)।वॉयसओवर
दृश्यमान रूप से, सब कुछ ठीक काम करता है, लेकिन मैं वॉयस ओवर के साथ एक समस्या में आया: जब मैं पहले बाल संग्रह दृश्य (यानी, बाहरी संग्रह दृश्य के पहले कक्ष का अंतिम आइटम) में अंतिम आइटम तक पहुंच गया, मैं स्वाइप करके अगले आइटम का चयन नहीं कर सकता। इसके बजाए, आईओएस ध्वनि बनाता है जैसे कि आखिरी वस्तु तक पहुंची थी।
मैं स्क्रॉल करने के लिए तीन-उंगली स्वाइप कर सकता हूं, और उसके बाद अगला तत्व चुन सकता हूं, लेकिन यह स्पष्ट रूप से आवश्यक नहीं होना चाहिए। अंतिम तत्व का चयन करना और रिवर्स ऑर्डर में बैक अप लेना इरादे के अनुसार काम करता है।
समस्या केवल तब होती है जब केवल एक सेल (बाहरी संग्रह दृश्य का) प्रारंभ में दिखाई देता है। यदि एकाधिक कोशिकाएं दिखाई देती हैं, तो सब कुछ काम करता है। हालांकि, मैं बाहरी कोशिकाओं के आकार को नहीं बदल सकता, क्योंकि यह लेआउट को पूरी तरह से बदल देगा।
मैंने नीचे एक नमूना दृश्य नियंत्रक बनाया जो इस मुद्दे को प्रदर्शित करता है। प्रोजेक्ट में दो संग्रह दृश्य समान हैं, कोशिकाओं के आकार को छोड़कर। छोटे कोशिकाओं के साथ पहला संग्रह दृश्य अपेक्षित काम करता है। दूसरा नहीं (जब अगले सेल का चयन करने के लिए स्वाइप करते हैं, तो आईओएस "बीप" ध्वनि बजाता है जब आखिरी दृश्यमान कोशिका का चयन किया गया था, भले ही और अधिक कोशिकाएं नीचे हों)।
तो, मेरे सवाल यह है:
- मैं कैसे दूसरा संग्रह दृश्य पहले एक की तरह व्यवहार कर सकते हैं?
- क्षैतिज स्वाइपिंग के माध्यम से सुलभ दूसरे संग्रह दृश्य में कोशिकाओं को आगे कैसे बना सकता है?
समाधान मैं अब तक का प्रयास किया है:
- एक अतः पद नेस्टेड संग्रह विचारों के लिए एक आवरण दृश्य बनाने का सुझाव। ऐसा कोई फर्क नहीं पड़ता है।
- मैंने संग्रह दृश्य के कस्टम उप-वर्ग में स्वयं को UIAccessibilityContainer प्रोटोकॉल को लागू करने का प्रयास किया। यह अजीब तरीकों से स्क्रॉलिंग तोड़ने लगता है।
- रखकर "लेआउट बदल गया" यादृच्छिक स्थानों में नोटिफिकेशन देखने के लिए अगर यह मदद करता है (ऐसा नहीं होता)
संपादित करें: एक ViewController का पूरा कोड कि इस मुद्दे को दर्शाता है:
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")
}
}
संपादित करें: यहां एक वीडियो है जो समस्या दिखाता है: https://vimeo.com/229249955 (ध्यान दें कि मैंने वहां कुछ विवरण जोड़ा है)।
क्या आप बाहरी संसाधन की बजाय यहां अपना कोड पोस्ट कर सकते हैं? –
मैं दृश्य नियंत्रक का कोड पोस्ट कर सकता हूं लेकिन स्टोरीबोर्ड के बिना इसका अधिक उपयोग नहीं है। क्या मुझे इसे पोस्ट करना चाहिए? – jasamer
स्टैक ओवरफ़्लो पर पोस्ट करते समय, एक [न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण] पोस्ट करने का प्रयास करें (https://stackoverflow.com/help/mcve) –