2012-10-01 9 views
10

मैं प्रोग्रामिंग के रूप में एक UICollectionView का उपयोग कर रहा हूं।FlowLAyout के साथ UICollectionView अनुभाग इन्सेट्स सेट करते समय स्क्रॉल नहीं करते

मैं निर्धारित किया है यह फ्रेम है इस प्रकार है:

flowLayout.sectionInset = UIEdgeInsetsMake(20.0, 20.0, 100.0, 20.0); 

मैं भी केवल 1 अनुभाग है:

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 3000) collectionViewLayout:flowLayout]; 

मेरे UICollectionViewFlowLayout एक वर्ग इनसेट के रूप में स्थापित है।

मैंने ऊंचाई दृश्य को स्क्रॉल करने के लिए 3,000 होने की ऊंचाई निर्धारित की है लेकिन यह नहीं है। मैं इसे उस पर सेट कर रहा हूं क्योंकि जब मैं नई वस्तुओं को सम्मिलित करता हूं तो संग्रह दृश्य ऊपर या नीचे स्क्रॉल नहीं लग रहा है।

UICollectionViewUIScrollView से उप-वर्गीकृत है, जिसका अर्थ है कि मैं स्क्रॉल व्यू सामग्री आकार को रीसेट कर सकता हूं। क्या यह ठीक से काम करेगा?

एकमात्र मुद्दा यह है कि यह काम करेगा यदि मैं सभी वस्तुओं के आकारों को जानता हूं जिसमें प्रत्येक पंक्ति पर कितनी वस्तुएं हैं।

यदि प्रत्येक आइटम का एक अलग आकार होता है, तो मैं प्रत्येक पंक्ति का आकार कैसे प्राप्त करूं? मुझे सभी पंक्ति आकार जोड़ने और self.collectionView की सामग्री आकार की ऊंचाई बढ़ाने की आवश्यकता होगी।

संपादित

यहाँ तक कि मेरे ऊपर सुझाव, सामग्री आकार को रीसेट, ठीक से काम नहीं करता है! मैंने अपने संग्रह दृश्य को अपडेट करते समय निम्नलिखित की कोशिश की:

int numberOfRows = self.dataArray.count/3; 
self.collectionView.contentSize = CGSizeMake(self.view.frame.size.width, (numberOfRows * 200) + 300); 

हालांकि यह बहुत बदसूरत है। ऐसा इसलिए है क्योंकि यह मानता है कि मेरी सभी छवियों का आकार 200x200px है, जो प्रति पंक्ति 3 छवियों को फिट करता है (इसलिए 3 से विभाजन)।

इसके अलावा, मेरे पास +300 के साथ भी, आखिरी पंक्ति में मैं केवल 3/4 देख सकता हूं और यह सब नहीं। मुझे और स्क्रॉल करना होगा और मैं इसे देख पाऊंगा लेकिन यह फिर से 3/4 तक वापस चला जाता है। रीफ्रेश करने के लिए स्क्रॉल की तरह इसकी तरह, जहां दृश्य केवल तभी चलता है जब आप इसे खींचते हैं और जब आप इसे छोड़ देते हैं तो उसे वापस जहां पर जाता है। ये क्यों हो रहा है? क्या यह ऐप्पल UICollectionView इतना खराब डिजाइन किया गया है? यह थोड़ा हास्यास्पद है ... UITableViews अपनी स्क्रॉल को स्वचालित रूप से उनकी सामग्री के अनुसार समायोजित करता है।

उत्तर

13

यूआईसीओलेक्शन व्यू के बारे में आपके कुछ अन्य सवालों के जवाब में, मैंने यह डेमो प्रोजेक्ट बनाया है, और यह ठीक है, इसलिए मुझे नहीं पता कि आपको क्या समस्या है। आखिरी पंक्ति को पूरी तरह से दिखने के लिए मुझे केवल एक ही चीज थी जो नीचे की इन्सेट के आकार को 9 0 तक बढ़ाने के लिए थी। मैंने प्रदर्शन बैचअपडेट्स को पूरा करने की विधि भी जोड़ दी: समापन: स्वचालित रूप से स्क्रॉल करने के लिए ताकि अंतिम जोड़ा गया आइटम दिखाई दे (ध्यान दें कि मैं performSelector का उपयोग करके कुछ अतिरिक्त आइटम जोड़ता हूं; ऑब्जेक्ट: बाद में :) :)। मेरी छवियां 48x48 हैं, और मैंने बस अपने संग्रह दृश्य को मेरे नियंत्रक के दृश्य की सीमाओं पर सेट किया है।

@interface ViewController() <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> { 
NSMutableArray *newData; 
} 
@property (nonatomic, retain) UICollectionView *collectionView; 
@property (nonatomic, retain) NSMutableArray *results; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    self.results = [NSMutableArray array]; 
    int i = 11; 
    while (i<91) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT00%d.jpg",i]]; 
     [self.results addObject:image]; 
     i++; 
    } 

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    //flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

    self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout]; 
    self.collectionView.dataSource = self; 
    self.collectionView.delegate = self; 
    self.view.backgroundColor = [UIColor blackColor]; 
    [self.view addSubview:self.collectionView]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"]; 
    //[self.collectionView registerClass:[RDCell class] forCellWithReuseIdentifier:@"myCell"]; 
    [self.collectionView reloadData]; 

    [self performSelector:@selector(addNewImages:) withObject:nil afterDelay:3]; 
} 

-(void)addNewImages:(id)sender { 
    newData = [NSMutableArray array]; 
    int i = 102; 
    while (i<111) { 
     UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"New_PICT0%d.jpg",i]]; 
     [newData addObject:image]; 
     i++; 
    } 
    [self addNewCells]; 
} 

-(void)addNewCells { 
    NSMutableArray *arrayWithIndexPaths = [NSMutableArray array]; 
    [self.collectionView performBatchUpdates:^{ 
     int resultsSize = [self.results count]; 
     [self.results addObjectsFromArray:newData]; 
     for (int i = resultsSize; i < resultsSize + newData.count; i++) 
      [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
     [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths]; 
    } 
    completion: ^(BOOL finished){ 
     [self.collectionView scrollToItemAtIndexPath:arrayWithIndexPaths.lastObject atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; 
    }]; 
} 


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section { 
    return [self.results count]; 
} 

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView { 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    //cell.iv.image = [self.results objectAtIndex:indexPath.row]; 
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]]; 
    return cell; 
} 


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [self.results objectAtIndex:indexPath.row]; 
    return CGSizeMake(image.size.width, image.size.height); 
} 

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    return UIEdgeInsetsMake(10, 10, 90, 10); 
} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"Selected Image is Item %d",indexPath.row); 
} 
9

3000 को UICollectionView की ऊंचाई अपनी स्क्रॉल समस्या बदतर कर देगा स्थापना: यहाँ कोड है ताकि आप इसे तुम्हारे पास क्या है की तुलना कर सकते हैं। यदि UICollectionView 3000 पिक्सल लंबा है तो इसे केवल स्क्रॉल करने की आवश्यकता होगी यदि इसमें 3000 से अधिक पिक्सल की सामग्री है। आपको इसे उस दृश्य की ऊंचाई पर सेट करना चाहिए जिसमें यह शामिल है (चौड़ाई के समान)।

AFAIK भी contentSize सीधे सेट नहीं करना चाहिए, बजाय आप UICollectionViewLayout का एक उपवर्ग में - (CGSize)collectionViewContentSize विधि ओवरराइड करने के लिए की जरूरत है, लेकिन आम तौर पर आप सामान्य उपयोग के लिए सामग्री का आकार बदलने की जरूरत नहीं होनी चाहिए बोल।

मैं आपकी समस्या के बारे में पूरी तरह से स्पष्ट नहीं हूं - क्या यह है कि जब आप एक स्क्रीन के अधिक से अधिक आइटम जोड़ते हैं तो आप स्क्रॉल नहीं कर सकते हैं?

+0

यह मेरे लिए समाधान था। मैं एक कस्टम प्रवाह लेआउट का उपयोग कर रहा था जो बहु स्तंभ लेआउट में वस्तुओं के बीच लंबवत अंतराल को हटा देता था। जब तक साइमन ने सुझाव दिया था तब तक मुझे केवल आधे आइटम मिल रहे थे। मुझे संदेह है कि मेरे पास यह मुद्दा था कि पूछे गए आइटमों की संख्या मानक लेआउट पर आधारित है। –

2

मुझे एक ही समस्या का सामना करना पड़ा क्योंकि मैं viewVillAppear विधि में अपने संग्रह दृश्य (यानी यह डेटा स्रोत) के तत्वों को प्रारंभ कर रहा था।

अंत में मैं केवल [self.collectionView reloadData]; जोड़ता हूं और यह ठीक काम करता है!

शायद आप एक ही मामले में हैं।

संबंधित मुद्दे