2013-01-23 22 views
7

पृष्ठभूमिiOS 6.0: UICollectionView टाइल्स की एक पृष्ठांकित क्षैतिज स्क्रॉल दृश्य को प्राप्त करने के प्रयास में pagingEnabled

मैं एक UICollectionView (पहली बार के लिए) को लागू करने के साथ कर रहा हूँ clipsToBounds सम्मान नहीं करता। मैं प्रत्येक टाइल फ्रेम के केंद्र में दिखाना चाहता हूं, इसकी बहन टाइल्स आंशिक रूप से बाईं ओर दाईं ओर दिखाई देती हैं (सफारी ऐप में पेज चयनकर्ता की तरह कुछ)। मुझे अंतर्निहित सेल डेक्यूइंग का लाभ उठाने के लिए UICollectionView का उपयोग करने में दिलचस्पी है और इसके बजाय घुमाए गए UITableView का उपयोग नहीं करना चाहिए।

अंक

मुद्दा मैं खोजने रहा है कि जब pagingEnabled = YES और clipsToBounds = NO का उपयोग कर, UICollectionView जैसे ही पेजिंग पूरा हो गया है के रूप में collectionView फ्रेम के बाहर की कोशिकाओं को हटा (वे visibleCells सरणी में नहीं कर रहे हैं) है। क्या कोई इस बुनियादी सेटअप को बनाए रखते हुए बहन टाइल्स के पूर्वावलोकन प्रदर्शित करने के प्रभाव को प्राप्त करने के बारे में सलाह दे सकता है? या मैं इस गलत तरीके से आ रहा हूँ?

स्क्रीनशॉट

शुरू start स्क्रॉल scrolling अंत end

स्क्रॉल स्क्रीन बिल्कुल सही है। लेकिन शुरुआत और अंत शॉट्स में मैं नीले मार्जिन में हरे रंग की दिखाई देना चाहता हूं। मैं collectionView में एक विशेषज्ञ नहीं हूँ

#import "AppDelegate.h" 

@interface ViewController : UICollectionViewController 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"ID"]; 
    [self.view setBackgroundColor:[UIColor blueColor]]; 
    // pad the collection view by 20 px 
    UIEdgeInsets padding = UIEdgeInsetsMake(20.0, 20.0, 20.0, 20.0); 
    [self.collectionView setFrame:UIEdgeInsetsInsetRect(self.view.frame, padding)]; 
    // set pagingEnabled and clipsToBounds off 
    [self.collectionView setPagingEnabled:YES]; 
    [self.collectionView setClipsToBounds:NO]; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 5; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ID" forIndexPath:indexPath]; 
    UILabel *label = [[UILabel alloc] initWithFrame:cell.bounds]; 
    label.textAlignment = NSTextAlignmentCenter; 
    label.text = [NSString stringWithFormat:@"%d", indexPath.row]; 
    [label setBackgroundColor:[UIColor greenColor]]; 
    [cell.contentView addSubview:label]; 
    return cell; 
} 
@end 

@implementation AppDelegate 
{ 
    ViewController *vc; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // setup the UICollectionViewFlowLayout 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    layout.itemSize = CGSizeMake(280, 280); 
    layout.minimumInteritemSpacing = 0; 
    layout.minimumLineSpacing = 0; 
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
    // add a custom UICollectionViewController to the window 
    vc = [[ViewController alloc] initWithCollectionViewLayout:layout]; 
    self.window.rootViewController = vc; 
    self.window.backgroundColor = [UIColor yellowColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
@end 

उत्तर

9

इसका हल समाधान वास्तव में काफी सरल था। मुझे केवल UICollectionViewCell कोशिकाओं को पर्याप्त पिक्सेल द्वारा ओवरलैप करने की आवश्यकता है ताकि वे अभी भी संग्रहित दृश्य के भीतर दिखाई दे सकें, पेजेड स्क्रॉलिंग समाप्त होने के बाद। प्रासंगिक कोड था

layout.itemSize = CGSizeMake(300, 300); 
layout.minimumLineSpacing = -20.0; 

और मैं UICollectionViewFlowLayout subclassed और overrode कोशिकाओं की गैर ओवरलैप आकार वापस जाने के लिए (CGSize)collectionViewContentSize विधि।

+0

हमने पाया कि यह तब तक काम करता है जब तक आपके पास 6 या अधिक कोशिकाएं न हों, जिस बिंदु पर कोशिकाएं गायब होने लगती हैं भले ही वे दृश्य फ्रेम के अंदर हों। ऐसा तब होता है जब प्रश्न में सेल * पड़ोसी कोशिकाओं के पीछे * है (यह वह जगह है जहां हमने जांच बंद कर दी है)। –

+0

मैं इस काम को आईओएस 8 पर, नए आईफोन आकारों पर और ऑटोलायआउट का समर्थन नहीं कर सकता। –

0

, लेकिन यह संभवतः हो सकता है cellForItemAtIndexPath में इस लाइन के साथ कार्य करें:

यहाँ क्या मेरी AppDelegate.m में है (बुनियादी सेटअप के लिए tutsplus.com को ऋण यहाँ):

[cell.contentView addSubview:label]; 

हर बार इसे कॉल किया जाता है, एक और लेबल सबव्यू सेल में जोड़ा जाता है। या तो मौजूदा लेबल या उपclass UICollectionViewCell की जांच करें?

+0

धन्यवाद! टिप्पणी करते हुए कि क्लिपिंग क्षेत्र को बिल्कुल प्रभावित नहीं करता है, इसलिए मूल समस्या को हल नहीं करता है, लेकिन अच्छी पकड़ है। –

2

नकारात्मक न्यूनतमलाइन स्पेसिंग का उपयोग करने के बारे में युक्ति के लिए बहुत धन्यवाद। मैंने एक परीक्षक एप्लिकेशन बनाया जो xib फ़ाइल से लोड किए गए संग्रह दृश्य कक्ष का उपयोग करता है। सेल की एक पारदर्शी पृष्ठभूमि और सेल की सामग्री के लिए "आंतरिक" दृश्य है।

इस तरह, एक कस्टम प्रवाह लेआउट आवश्यक नहीं है।

https://github.com/j4johnfox/CollectionViewTester

0

तुम भी -pointInside:withEvent: ओवरराइड करने के लिए स्क्रॉल इशारों संग्रह को देखने के फ्रेम के बाहर शुरू करने के लिए अनुमति देने के लिए चाहता हूँ। मैं इस एक UIEdgeInsets संपत्ति का उपयोग कर कि मेरे संग्रह को देखने के उपवर्ग में:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    CGRect extendedBounds = UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets); 

    return CGRectContainsPoint(extendedBounds, point); 
} 

आप App स्टोर सुरक्षा की जरूरत नहीं है, तो आप _visibleBounds ओवरराइड कर सकते हैं ऋणात्मक रिक्ति हैक्स से बचने के लिए:

- (CGRect)_visibleBounds { 
    return UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets); 
} 

आप अगर ' कोड आकार पर भी दबाया नहीं गया है और ऐप स्टोर सुरक्षा की आवश्यकता है, आप PSTCollectionView को उपclass भी कर सकते हैं और संभवतः उसी प्रभाव के लिए visibleBoundRects ओवरराइड कर सकते हैं।