2012-03-29 17 views
6

मेरे पास UITableView है जिसमें तीन UIImageView प्रति सेल दृश्य हैं, एक बार में तीन सेल दृश्य पर प्रदर्शित होते हैं (कुल नौ UIImageView विचारों के लिए)। इसे बुकशेल्फ़ के रूप में सोचें। कभी-कभी मेरे पास 500 किताबें हो सकती हैं।UITmageView पर UIImageView पर एक छाया जोड़ा गया प्रदर्शन प्रदर्शन करता है ... क्यों?

मैं कोड के साथ UIImageView यह है कि करने के लिए छाया जोड़ दिया है: जैसा कि ऊपर देखा, स्क्रॉल प्रदर्शन बस पूरी तरह से मार दिया जाता है और अस्थिर हो जाता है

UIImageView *itemImageView = [[UIImageView alloc] initWithFrame:CGRectMake(25, 7, 65, 75)]; 
itemImageView.contentMode = UIViewContentModeScaleAspectFit; 
itemImageView.tag = 6; 
itemImageView.layer.shadowColor = [UIColor blackColor].CGColor; 
itemImageView.layer.shadowOffset = CGSizeMake(3, -1); 
itemImageView.layer.shadowOpacity = 0.7; 
itemImageView.layer.shadowRadius = 3.0; 
itemImageView.clipsToBounds = NO; 
[cell.contentView addSubview:itemImageView]; 

जब मैं छाया कोड जोड़ सकते हैं,। प्रत्येक छवि में Rect भिन्न होता है, इसलिए प्रत्येक आइटम के लिए छाया को स्क्रॉल करने के लिए बनाया जाना चाहिए। किसी को भी इस समस्या के बिना UITableView पर मेरी छवियों में छाया जोड़ने के बारे में कोई सुझाव है?

+0

मैं यहाँ एक ऐसी ही सवाल का जवाब दे: http://stackoverflow.com/a/10133182/242769 – aryaxt

उत्तर

0

क्या आप पुन: उपयोग सक्रिय करते हैं? यदि नहीं, तो दृश्य दृश्य में प्रत्येक बार कोशिकाओं को फिर से चालू कर दिया जाएगा (उदाहरण के लिए, स्क्रॉलिंग के दौरान)। यह निश्चित रूप से बहुत सारे प्रदर्शन खाएगा।

+0

हाँ, मैं –

9

आप एक प्रदर्शन में सुधार दिखाई देगा जब आपने

itemImageView.layer.shadowPath = 
     [UIBezierPath bezierPathWithRect:itemImageView.layer.bounds].CGPath; 

जोड़ने लेकिन सामान्य रूप में, इस तरह परत संचालन एक तालिका दृश्य में प्रदर्शन मार डालेगा। मैंने बिल्कुल एक ही समस्या का अनुभव किया, और हमने छाया प्रभाव को समाप्त कर दिया। यह इसके लायक नहीं था।

+0

यह काम करता है लेकिन छाया एक दृश्य के सभी 4 पक्षों पर असाइन किया गया है .. – NSPratik

1

छाया महंगे हैं और आपके प्रदर्शन को मार देंगे।

बेहतर तरीका पृष्ठभूमि में छायांकित छवि को प्रस्तुत करना, कैश/इसे सहेजना और इसे तैयार होने पर दृश्य पर प्रदर्शित करना है।

संपादित करें: आप कोर ग्राफिक्स/CGImage दिनचर्या को देखने की इच्छा रखते हैं। विशेष रूप से CGContextSetShadowWithColor आपको एक छाया खींच देगा।

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html

+0

पुन: उपयोग किया है है आप कहते हैं आपका विचार एक बुकशेल्फ़ जैसा दिखता है - कम से कम मेरे लिए, इसका तात्पर्य है कि छाया के साथ सब कुछ आयताकार (और शायद एक ही आकार) है। उसी छाया छवि का पुन: उपयोग करना निश्चित रूप से उस मामले में जाने के तरीके की तरह लगता है। (और यदि आपके आयताकार एक ही आकार के नहीं हैं, तो भी आप छवि को यूआईएममेज के आकार बदलने योग्य छवि समर्थन के साथ पुन: उपयोग कर सकते हैं।) – rickster

+0

यह आवश्यक रूप से आयताकार होने की आवश्यकता नहीं है। एक छाया छवि को एक मनमाना अग्रभूमि पर प्रस्तुत करना संभव है, फिर उस मनमानी पृष्ठभूमि के उस बिंदु को प्रस्तुत करें। मेरा सुझाव है कि छवि सैंडविच (अग्रभूमि, छाया, पृष्ठभूमि) कैशिंग है – lorean

+0

धन्यवाद रिकस्टर ... मेरी सभी छवियां आयताकार हैं। मैं इसे एक शॉट दूंगा और इसे आवश्यकतानुसार आकार बदल दूंगा और देखें कि यह कैसा दिखता है। –

3

आप CoreAnimation सर्वोत्तम प्रथाओं पर WWDC वीडियो समीक्षा करनी चाहिए। आप अनुरोध कर सकते हैं कि छाया की रास्टराइज्ड प्रति स्मृति में कैश की जाए। कोको निश्चित रूप से एक पूर्व-प्रस्तुत छवि पर वापस गिरने के बिना फ्लाई पर इन छाया को प्रस्तुत करने के लिए पर्याप्त तेज़ है।

उदाहरण:

itemImageView.layer.shouldRasterize = YES; 

इसके अलावा, मैं UIBezierPath के बारे में जवाब ऊपर से मतदान किया। यह सर्वोत्तम प्रथाओं में भी उल्लेख किया गया है, लेकिन एक कैलियर के छाया पथ को सेट करना एक बड़ा प्रदर्शन बढ़ावा है। आप छाया पथ में हेरफेर करके कुछ दिलचस्प विशेष प्रभाव भी बना सकते हैं। बाहर मेरी एक ही सवाल यहाँ

+1

कंधे को जोड़ना = हाँ ने पूरी तरह से छवि की गुणवत्ता को मार डाला। कोई विचार क्यों? –

+0

पदानुक्रम में सभी परतों के लिए यह एक रास्टर छवि का पुन: उपयोग कर रहा है। क्या आपने छवि गुणवत्ता में सुधार करने के लिए छाया पथ भी सेट किया था? – Sam

+3

यदि परत की गुणवत्ता खराब हो जाती है तो यह संभवतः बी/सी कोड जोड़ने की आवश्यकता है: self.rasterizationScale = [[UIScreen mainScreen] scale] – capikaw

0

की जांच: App running slowly because of UIImageViews

मैं इस कोड का प्रयोग करेंगे:

imageView.layer.masksToBounds = NO; 
UIBezierPath *path = [UIBezierPath imageView.bounds]; 
imageView.layer.shadowPath = path.CGPath; 
0

मैं एक tableviewcell अंदर लेबल के लिए छाया जोड़ने के साथ एक ही समस्या है।

if(cell == nil){ 
    //layout cell 

ये स्क्रॉल एक छोटा सा अनुकूलित किया है, लेकिन इसकी काफी अस्थिर: मैं जब सेल बनाया जाएगा cellForRowAtIndexPath अंदर तत्वों लेआउट की कोशिश की।

अपने चित्रों को गुणवत्ता आप अगर आप सक्रिय "shouldRasterize" भी rasterizationScale जोड़ना चाहिए के अनुकूलन के लिए:

aLabel.layer.shouldRasterize = YES; 
aLabel.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 

हो सकता है कि किसी को कुछ विचार कैसे सामान्य स्क्रॉल आईओएस प्राप्त करने के लिए कोड का अनुकूलन करने के है। THX

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