2012-05-01 12 views
9

का कारण बनता है मेरे पास एक कस्टम UITableViewCell है जिसमें UIImageView और UILabel शामिल हैं। सेल 320x104px है और imageView पूरे क्षेत्र को लेबल के साथ ले जाता है। केवल 8 कोशिकाएं हैं।कस्टम UITableViewCell बड़े UIImageView के साथ स्क्रॉल अंतराल

ViewDidLoad में मैं सभी आवश्यक छवियों को सामने आया और उन्हें सही आयामों पर एक शब्दकोश में कैशिंग कर रहा हूं।

जब मैं UITableView स्क्रॉल करता हूं तो हर बार जब कोई नया सेल सामना होता है तो एक उल्लेखनीय अंतराल होता है। यह मेरे लिए कोई समझ नहीं आता है क्योंकि यह जिस छवि का उपयोग कर रहा है वह पहले से ही बनाया गया है और कैश किया गया है। मैं जो सेल से पूछ रहा हूं वह छवि को प्रस्तुत करने के लिए अपने UIImageView के लिए है।

मैं अपने दृश्य के साथ एक कस्टम सेल का उपयोग कर रहा एक xib में और के साथ उपयोग करने के लिए अपने UITableView को विन्यस्त:

[self.tableView registerNib: [UINib nibWithNibName: @ "ActsCell" बंडल: शून्य] forCellReuseIdentifier: myIdentifier];

सेल निर्माण और विन्यास:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString* reuseIdentifier = @"ActsCell"; 
    ActsCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    // Configure the cell... 
    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)configureCell:(ActsCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    Act* act = [self.acts objectAtIndex:indexPath.row]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.title.text = act.name; 
    cell.imageView.image = [self.imageCache objectForKey:act.uid]; 
} 

क्या अंतराल के कारण हो सकता है? एसिंक को कुछ भी करने की कोशिश करने में कोई फायदा नहीं होगा क्योंकि हर समय-गहन काम किया जाता है।

+0

मैं दो चीजों के बारे में सोच सकता हूं। एक यह है कि डेक्यूइंग विफल रहता है क्योंकि आप 'reusableIdentifier' को ठीक से सेट नहीं करते हैं। दूसरा छवियों का आकार है। भले ही छवियों को लोड किया गया हो, सीजी को दिखाने से पहले छवि डेटा को संसाधित करने की आवश्यकता है, जिसमें स्केलिंग, कंपोजिटिंग इत्यादि जैसे महंगे संचालन शामिल हो सकते हैं। – Lvsti

+0

@Lvsti क्या आप इस बात का विस्तार कर सकते हैं कि मैं reuseIdentifier को ठीक से कैसे सेट नहीं कर रहा हूं? – Undistraction

+0

आप सही हैं, शायद यह मामला नहीं है, अन्यथा आपको किसी भी कोशिका को वापस लेने पर वापस नहीं मिलेगा ... – Lvsti

उत्तर

28

क्या आप किसी भी मौके से स्थानीय फाइलों से छवियों को लोड करते हैं?

मैं UIImage में कुछ आलसी लोड हो रहा है तंत्र है कि वहाँ मिल गया है उपकरण का उपयोग करके - वास्तविक छवि डेटा केवल मुख्य थ्रेड जो स्क्रॉल दौरान अंतराल के कारण होता है पर यह प्रतिपादन के स्तर पर पीएनजी से decompressed किया गया था।

तो, -initWithContentsOfFile: विधि के साथ UIImage की लोडिंग के बाद, मैं कोड गुप्त संदर्भ के लिए इस छवि की सामग्री प्रस्तुत करने के लिए जोड़ दिया है, नई UIImage के रूप में इस संदर्भ को बचाया और UITableViewCell में UIImageView लिए इसका इस्तेमाल किया, यह करने के लिए स्क्रॉल किए गए फिर से आंखों के लिए चिकनी और सुखद हो।

संदर्भ के मामले में वहाँ सरल कोड मैं अलग थ्रेड (एआरसी का उपयोग) में छवि सामग्री के पढ़ने के लिए मजबूर करने का उपयोग कर रहा है:

UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path]; 

CGSize imageSize = productImage.size; 
UIGraphicsBeginImageContext(imageSize); 
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)]; 
productImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

और मुझे लगता है UIImage की सतह को इस तरह से बनाया प्रतिपादन के लिए उपयुक्त समर्थित प्रारूप में होगा, जो इसे मुख्य थ्रेड पर प्रस्तुत करने के लिए आवश्यक ऑफ़लोड कार्य भी करेगा।

संपादित करें: UIGraphicsGetImageFromCurrentImageContext() के लिये दस्तावेज कहते हैं कि यह केवल मुख्य थ्रेड से इस्तेमाल किया जाना चाहिए, लेकिन नेट पर खोज कर या तो पता चलता है कि आईओएस 4 से शुरू UIGraphics.. तरीकों धागा सुरक्षित हो गया।

+5

खर्च कर रहे हैं यह पूरी तरह से मेरे लिए अमूल्य था साथ प्रोफाइलर चल रहा लायक हो सकता है। मैं एक फोटो प्रदर्शित करने के लिए प्रत्येक सेल में UIImageViews के साथ UICollectionView पर चटनी स्क्रॉलिंग से पीड़ित था। मैंने * विभिन्न समाधानों की * बहुत कोशिश की लेकिन 60 एफपीएस के करीब आने का एकमात्र तरीका बेहद हैकी था। मैंने जिन समाधानों का प्रयास किया उनमें से अधिकांश छवियों का उपयोग करते हुए UIImages के एनएससीएच को प्रीलोड करना शामिल था, लेकिन जो कुछ भी मैंने किया था, वह हमेशा थोड़ी सी कूद थी क्योंकि नई कोशिकाएं तब तक स्क्रीन पर आईं जब तक मैंने ऊपर अपना कोड लागू नहीं किया। जैसा कि आप कहते हैं, छवि में निर्मित आलसी लोडिंग तंत्र का कुछ प्रकार होना चाहिए WithContentsOfFile जो दस्तावेज़ों में उल्लिखित नहीं है। – alistairholt

+0

यह मेरे लिए यह काम, डाउनलोड किए गए डेटा के बजाय UIImage को स्टोर करने के बाद जितना आसान होगा, तब प्रत्येक बार इसका उपयोग यूआईएममेज में परिवर्तित हो जाएगा। आपका बहुत बहुत धन्यवाद। – Envil

+0

धीमी/चटनी कारण के लिए इतनी देर तक खोज रहे थे। आप श्रीमान एक नायक – user1838169

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