UIRolreshControl पर UICollectionView केवल तभी काम करता है जब संग्रह कंटेनर की ऊंचाई को भरता है


142

मैं एक जोड़ने के लिए कोशिश कर रहा हूँ UIRefreshControlएक करने के लिए UICollectionViewहै, लेकिन समस्या यह है कि ताज़ा नियंत्रण जब तक संग्रह दृश्य अपनी मूल कंटेनर की ऊंचाई भरता प्रकट नहीं होता है। दूसरे शब्दों में, जब तक कि संग्रह दृश्य को स्क्रॉलिंग की आवश्यकता के लिए पर्याप्त नहीं है, इसे ताज़ा नियंत्रण दृश्य को प्रकट करने के लिए नीचे नहीं खींचा जा सकता। जैसे ही संग्रह अपने मूल कंटेनर की ऊंचाई से अधिक हो जाता है, इसे नीचे खींच लिया जाता है और ताज़ा दृश्य का पता चलता है।

मैं सिर्फ एक के साथ एक त्वरित आईओएस परियोजना की स्थापना की है UICollectionViewसंग्रह दृश्य इतना है कि मैं जोड़ सकते हैं करने के लिए एक आउटलेट के साथ मुख्य दृश्य के अंदर, UIRefreshControlमें इसे करने के लिए viewDidLoad। पुन: पहचानकर्ता के साथ एक प्रोटोटाइप सेल भी हैcCell

यह नियंत्रक में सभी कोड है, और यह इस मुद्दे को बहुत अच्छी तरह से प्रदर्शित करता है। इस कोड में मैंने सेल की ऊँचाई 100 तक निर्धारित की है, जो डिस्प्ले को भरने के लिए पर्याप्त नहीं है, और इसलिए दृश्य को खींचा नहीं जा सकता है और ताज़ा नियंत्रण दिखाई नहीं देगा। प्रदर्शन को भरने के लिए इसे कुछ उच्च पर सेट करें, फिर यह काम करता है। कोई विचार?

@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [self.collectionView addSubview:refreshControl];
}

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

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

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(self.view.frame.size.width, 100);
}

iOS 10 के लिए इसे देखें stackoverflow.com/questions/19483511/…
अनीश पराजुली

1
उपयोगalwaysBounceVertical
onmyway133

जवाबों:


395

इसे इस्तेमाल करे:

self.collectionView.alwaysBounceVertical = YES;

के लिए पूरा कोड UIRefreshControl

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;

1
बहुत बढ़िया, वह लाइन सटीक फिक्स है, बाकी कोड कोई फर्क नहीं पड़ता। StackOverflow पर आपके लिए एक बुरी शुरुआत नहीं है! चीयर्स!
मटका

7
हाँ, कोई बात नहीं। यह स्पष्ट है कि मैं एक नौसिखिया हुह हूं। वैसे भी पता चलता है कि मैं उसी स्थिति में फंस गया था जब मैंने आपकी पोस्ट देखी थी। जब मुझे इसका समाधान मिला, हालांकि मुझे इसे साझा करना चाहिए। चीयर्स
लैरी

6
खैर, जुआन, आप शायद अपने प्रश्न का उत्तर पहले ही पा चुके हैं। लेकिन, ताज़ा करने के बाद अपनी सामान्य स्थिति में ताज़ा नियंत्रण वापस करने के लिए, आपको कॉल करना होगा [refreshControl endRefreshing]
मेरीट

2
यह दुर्भाग्य से अब समर्थित नहीं है। UIRefreshControl का उपयोग केवल UITableViewController के साथ किया जा सकता है और अब इसे सख्ती से लागू किया जाता है।
ल्यूक वान

3
IOS 10 में, UIScrollView(एक पर्यवेक्षक की UICollectionView) के पास refreshControlअब एक प्रॉपर्टी है। developer.apple.com/videos/play/wwdc2016/219/?time=2033
स्ट्रीटर

29

विशेषताएँ / स्क्रॉल दृश्य / स्टोरीबोर्ड / Xib में ऊर्ध्वाधर रूप से उछाल

यहाँ छवि विवरण दर्ज करें


23

स्विफ्ट में लैरी का जवाब:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.blueColor()
    refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

स्विफ्ट 3:

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = .blue
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Const अपरिभाषित चर की त्रुटि देता है। अगर कोई उसी स्थिति का सामना करता है, तो उसे उसी के साथ UIColor.whiteColor()या जो भी रंग पसंद हो, उसे बदल दें ।
फैसल

1
इसके अलावा स्विफ्ट 2.2 उपयोग के लिएaction: #selector(self.refresh)
फैसल

1

यदि आपके collectionviewपास एक सामग्री का आकार बड़ा है जो लंबवत रूप से स्क्रॉल करता है, तो यह ठीक है, लेकिन आपके मामले में यह नहीं है।

आपको संपत्ति को सक्षम करना होगा AlwaysBounceVertical, ताकि आप सेट कर सकेंself.collectionView.alwaysBounceVertical = YES;


0

मैं भी इसी मुद्दे का सामना कर रहा था, मैं UIRefreshControlतब तक उपयोग करने में सक्षम नहीं था जब तक कि UICollectionViewसामग्री का आकार बड़े पैमाने पर लंबवत स्क्रॉल करने के लिए पर्याप्त नहीं था,

इसे हल करने की bouncesसंपत्ति निर्धारित करनाUICollectionView

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];

0

मैं beginRefreshing()सही कह रहा हूँ viewDidLoad(), लेकिन कुछ स्क्रीन पर यह काम नहीं करता है। और केवल collectionView.layoutIfNeeded()में viewDidLoad()मुझे मदद मिली


0

आपको एपी कॉल में चेक करना होगा यदि संग्रह दृश्य ताज़ा स्थिति में है तो ताज़ा नियंत्रण को खारिज करने के लिए ताज़ा करें।

private let refreshControl = UIRefreshControl()
 refreshControl.tintColor = .white
 refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
 collectionView.addSubview(refreshControl)
 @objc func refreshData() {
    // API Call
 }
// Disable refresh control if already refreshing 
if refreshControl.isRefreshing {
    refreshControl.endRefreshing()
}

स्क्रॉल पर उल्लिखित होने के लिए मेरी स्टोरीबोर्ड फ़ाइल में सक्षम है।
असद जमील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.