2015-12-06 21 views
7

के लिए कस्टम फ़ोकस इंजन व्यवहार अनुभागों के साथ मैं एक मानक UICollectionView का उपयोग करता हूं। मेरी कोशिकाएं ग्रिड की तरह रखी जाती हैं। किसी चयनित दिशा में अगला सेल सही ढंग से केंद्रित होता है यदि उपयोगकर्ता ऐप्पल टीवी रिमोट के साथ फोकस करता है। लेकिन अगर ग्रिड में "अंतर" है, तो डिफ़ॉल्ट फोकस इंजन अनुभागों पर कूदता है। यह एक सेल पर ध्यान केंद्रित करने के लिए करता है जो कई वर्गों को दूर कर सकता है लेकिन एक ही कॉलम में है।UICollectionView

सरल उदाहरण: 3 अनुभाग हैं। पहले खंड में 3 कोशिकाएं हैं। दूसरे में 2 कोशिकाएं हैं और आखिरी में 3 कोशिकाएं हैं। निम्न छवि देखें:

enter image description here

हरी सेल केंद्रित है और उपयोगकर्ता नीचे की दिशा को छूती है तो, पीले सेल ध्यान केंद्रित हो जाता है और खंड दो फोकस इंजन द्वारा छोड़ी गई है।

मैं इसे मजबूर करना चाहता हूं कि कोई भी वर्ग कूद नहीं सकता है। तो पीले रंग के सेल पर ध्यान केंद्रित करने के बजाय मैं नीले रंग के सेल पर ध्यान केंद्रित करना चाहता हूं।

मैंने सीखा कि ऐप्पल टीवी फोकस इंजन आंतरिक रूप से ग्रिड सिस्टम की तरह काम करता है और वर्णित व्यवहार डिफ़ॉल्ट है। अन्य आंदोलनों (उदा। विकर्ण) की अनुमति देने के लिए हमें अदृश्य UIFocusGuide एस रखकर फोकस इंजन की सहायता करने की आवश्यकता है जो फोकस इंजन को preferredFocusedView पर रीडायरेक्ट कर सकता है।

तो निम्न छवि में UICollectionView अनुभाग की खाली जगह में एक अदृश्य लाल फोकस गाइड रखा गया है जो वांछित नीले रंग के सेल को नीचे फोकस करेगा। मुझे लगता है कि थियोरी में यह सही समाधान होगा।

enter image description here

लेकिन यह कैसे मैं UICollectionView वर्गों के सभी खाली स्थान को UIFocusGuide रों जोड़ना होगा? मैंने कई चीजों की कोशिश की है लेकिन कुछ भी काम नहीं किया है। शायद इसे एक सजावटी व्यू के रूप में जोड़ें लेकिन यह गलत लगता है। या अतिरिक्त कोशिकाओं के रूप में, लेकिन यह डेटा परत तोड़ता है और बाधाएं एंकर काम नहीं करते हैं।

क्या किसी को UIFocusGuide एस UICollectionView में जोड़ने का तरीका है?

+0

एक ही समस्या पाया जा सकता है। क्या आपने संग्रह दृश्य को ओवरराइड करने का प्रयास किया है: canFocusItemAtIndexPath और पीले सेल में झूठी वापसी? –

+0

नहीं, मैंने नहीं किया है। लेकिन मुझे लगता है कि थोड़ा गड़बड़ पैदा कर सकता है, क्योंकि कोशिकाओं को ध्यान केंद्रित किया जाना चाहिए। मैं अभी भी 'यूफोकसगाइड' तकनीक पसंद करता हूं। लेकिन अभी भी यह नहीं पता कि इसे कैसे प्राप्त किया जाए। मैंने सेब मंचों में भी पूछा: https://forums.developer.apple.com/message/93020 अगर आपको कोई समाधान मिला तो कृपया मुझे सूचित करें। –

उत्तर

0

एक समाधान UICollectionViewFlowLayout को एक लेआउट के साथ उपclass करना है जो सभी खाली क्षेत्रों के लिए UIFocusGuide एस के साथ अनुपूरक दृश्य जोड़ता है।

self.supplementaryViewAttributeList = [NSMutableArray array]; 
if(self.collectionView != nil) { 
    // calculate layout values 
    CGFloat contentWidth = self.collectionViewContentSize.width - self.sectionInset.left - self.sectionInset.right; 
    CGFloat cellSizeWithSpacing = self.itemSize.width + self.minimumInteritemSpacing; 
    NSInteger numberOfItemsPerLine = floor(contentWidth/cellSizeWithSpacing); 
    CGFloat realInterItemSpacing = (contentWidth - (numberOfItemsPerLine * self.itemSize.width))/(numberOfItemsPerLine - 1); 

    // add supplementary attributes 
    for (NSInteger numberOfSection = 0; numberOfSection < self.collectionView.numberOfSections; numberOfSection++) { 
     NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:numberOfSection]; 
     NSInteger numberOfSupplementaryViews = numberOfItemsPerLine - (numberOfItems % numberOfItemsPerLine); 

     if (numberOfSupplementaryViews > 0 && numberOfSupplementaryViews < 6) { 
      NSIndexPath *indexPathOfLastCellOfSection = [NSIndexPath indexPathForItem:(numberOfItems - 1) inSection:numberOfSection]; 
      UICollectionViewLayoutAttributes *layoutAttributesOfLastCellOfSection = [self layoutAttributesForItemAtIndexPath:indexPathOfLastCellOfSection]; 

      for (NSInteger numberOfSupplementor = 0; numberOfSupplementor < numberOfSupplementaryViews; numberOfSupplementor++) { 
       NSIndexPath *indexPathOfSupplementor = [NSIndexPath indexPathForItem:(numberOfItems + numberOfSupplementor) inSection:numberOfSection]; 
       UICollectionViewLayoutAttributes *supplementaryLayoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:ARNCollectionElementKindFocusGuide withIndexPath:indexPathOfSupplementor]; 
       supplementaryLayoutAttributes.frame = CGRectMake(layoutAttributesOfLastCellOfSection.frame.origin.x + ((numberOfSupplementor + 1) * (self.itemSize.width + realInterItemSpacing)), layoutAttributesOfLastCellOfSection.frame.origin.y, self.itemSize.width, self.itemSize.height); 
       supplementaryLayoutAttributes.zIndex = -1; 

       [self.supplementaryViewAttributeList addObject:supplementaryLayoutAttributes]; 
      } 
     } 
    } 
} 

और फिर layoutAttributesForSupplementaryViewOfKind: विधि इस तरह की जरूरत लेआउट देता है: अब आप अपने पूरक

if ([elementKind isEqualToString:ARNCollectionElementKindFocusGuide]) { 
    for (UICollectionViewLayoutAttributes *supplementaryLayoutAttributes in self.supplementaryViewAttributeList) { 
     if ([indexPath isEqual:supplementaryLayoutAttributes.indexPath]) { 
      layoutAttributes = supplementaryLayoutAttributes; 
     } 
    } 
} 

मूल रूप से कस्टम प्रवाह लेआउट की जरूरत लेआउट prepareLayout इस तरह जिम्मेदार बताते गणना करता है दृश्यों को केवल पूरक दृश्य के रूप में एक ही आकार के UIFocusGuide की आवश्यकता है। बस।

विधि वर्णित की एक पूरी कार्यान्वयन मेरे लिए here on gitHub

0

अपने लक्ष्य को प्राप्त करने के दो तरीके। कम से कम मैंने कोशिश की और इसे काम किया। =)। अन्य तरीके भी हो सकते हैं।

1:

अपने लक्ष्य को प्राप्त करने का सबसे आसान तरीका कोशिकाओं क्षैतिज संग्रह दृश्य जिसमें के साथ खड़ी संग्रह दृश्य जोड़ने है। प्रत्येक क्षैतिज संग्रह आपका खंड है।

सुनिश्चित करें कि आप ऊर्ध्वाधर संग्रह देखने के लिए निम्न कोड जोड़ा बनाओ:

func collectionView(collectionView: UICollectionView, canFocusItemAtIndexPath indexPath: NSIndexPath) -> Bool { 
    return false 
} 

2:

आप UIFocusGuide उपयोग करना चाहते हैं मुझे लगता है कि फोकस गाइड को जोड़ने के लिए एक अच्छी जगह अनुभाग शीर्ष लेख है। अनुभाग हेडर में अपनी फोकस मार्गदर्शिका सुनिश्चित करें और पसंदीदा अनुभाग को प्रत्येक अनुभाग में स्विच के रूप में अपडेट करें। मेरे मामले में जब मैं अनुभाग छोड़ता हूं तो मैं प्रत्येक खंड का पहला सेल असाइन करता हूं।