के साथ देखने में आता है मुझे बड़ी स्थानीय रूप से संग्रहीत छवि का आकार बदलने की आवश्यकता है (self.optionArray
में निहित) और फिर इसे संग्रह दृश्य में दिखाएं। अगर मैं इसे दिखाता हूं, तो आईओएस छवियों का आकार बदलने की कोशिश कर रहा है क्योंकि मैं जल्दी से स्मृति-संबंधित दुर्घटनाओं को हल करता हूं।UICollectionView सेल छवि बदलती है क्योंकि यह जीसीडी
नीचे दिए गए कोड में, संग्रह दृश्य आसानी से स्क्रॉल करेगा, लेकिन कभी-कभी यदि मैं बेहद तेज़ी से स्क्रॉल करता हूं, तो एक गलत छवि होगी जो दिखाती है और फिर स्क्रॉलिंग को कम करने के बाद सही में बदल जाती है। cell.cellImage.image
को nil
को क्यों ठीक नहीं कर रहा है?
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CustomTabBarCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CustomTabBarCell" forIndexPath:indexPath];
cell.cellImage.image = nil;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
cell.cellImage.image = nil;
UIImage *test = [self.optionArray objectAtIndex:indexPath.row];
UIImage *localImage2 = [self imageWithImage:test scaledToSize:CGSizeMake(test.size.width/5, test.size.height/5)];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.cellImage.image = localImage2
cell.cellTextLabel.text = @"";
[cell setNeedsLayout];
});
});
}
return cell;
}
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
संपादित करें: मैं कैश करने के लिए पहली और नहीं के बराबर एक और async जोड़ा गया है और cell.image प्रारंभ। मुझे शुरुआती फास्ट स्क्रॉल पर एक ही समस्या है। हालांकि, स्क्रॉल बैक अप पर, अब यह निर्दोष है।
मैं जोड़ा इस:
-(void)createDictionary
{
for (UIImage *test in self.optionArray) {
UIImage *shownImage = [self imageWithImage:test scaledToSize:CGSizeMake(test.size.width/5, test.size.height/5)];
[localImageDict setObject:shownImage forKey:[NSNumber numberWithInt:[self.optionArray indexOfObject:test]]];
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
if (!localImageDict) {
localImageDict = [[NSMutableDictionary alloc]initWithCapacity:self.optionArray.count];
}
else {
[localImageDict removeAllObjects];
}
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
[self createDictionary];
});
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CustomTabBarCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CustomTabBarCell" forIndexPath:indexPath];
cell.cellImage.image = nil;
cell.cellImage.image = [[UIImage alloc]init];
if ([localImageDict objectForKey:[NSNumber numberWithInt:indexPath.row]]) {
cell.cellImage.image = [localImageDict objectForKey:[NSNumber numberWithInt:indexPath.row]];
cell.cellTextLabel.text = @"";
}
else {
cell.cellImage.image = nil;
cell.cellImage.image = [[UIImage alloc]init];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
UIImage *test = [self.optionArray objectAtIndex:indexPath.row];
UIImage *shownImage = [self imageWithImage:test scaledToSize:CGSizeMake(test.size.width/5, test.size.height/5)];
[localImageDict setObject:shownImage forKey:[NSNumber numberWithInt:indexPath.row]];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.cellImage.image = shownImage;
cell.cellTextLabel.text = @"";
[cell setNeedsLayout];
});
});
}
}
return cell;
सभी छवियां स्थानीय हैं, सर्वर से कोई भी डाउनलोड नहीं किया जाता है। क्या इससे आपकी कोई भी सिफारिशें बदलती हैं? – Eric
@ एरिक आह, माफ करना मैंने उसे नोटिस नहीं किया। उस स्थिति में, मेरा दूसरा बिंदु खुद को प्रकट करने की संभावना नहीं है (हालांकि सैद्धांतिक रूप से यह कर सकता है)। और चौथा बिंदु भी एक मुद्दा से कम है। लेकिन अंक एक और तीन निश्चित रूप से प्रासंगिक हैं और यदि आप कैश का उपयोग करते हैं तो चौथे बिंदु के बारे में आप थोड़ा प्रदर्शन सुधार देख सकते हैं। मैं आपको सबसे धीमे संभावित डिवाइस पर अपने कोड का परीक्षण करने के लिए प्रोत्साहित करता हूं, क्योंकि आपको सिम्युलेटर या किसी नए डिवाइस पर इनमें से कुछ समस्याएं नहीं दिखाई देगी। – Rob
क्या आप मेरे संपादन को देख सकते हैं? – Eric