2016-07-27 7 views
5

मैं कैलियर का उपयोग कर UITableViewCell पर छाया लागू कर रहा हूं।UITableViewCell में CALayer छाया गलत तरीके से खींचा गया

- (void)addShadowToView:(UIView *)view 
{ 
    // shadow 
    view.layer.shadowColor = [[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]; 
    view.layer.shadowOpacity = 1.0f; 
    view.layer.shadowOffset = CGSizeMake(0.0f, 3.0f); 
    view.layer.shadowRadius = 6.0f; 

    CGRect shadowFrame = view.layer.bounds; 
    CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath; 
    view.layer.shadowPath = shadowPath; 
} 

मुद्दा है कि कुछ tableviewcells के लिए, छाया सेल की पूरी चौड़ाई अवधि नहीं करता है:

यहाँ मेरी कोड है। कुछ कोशिकाओं के लिए यह सही होगा, दूसरों के लिए यह दोषपूर्ण होगा। मुझे पता है कि डिवाइस का घूर्णन भी इसे प्रभावित करता है, और टेबलव्यू डेटा को पुनः लोड करने से कभी-कभी इसे हल किया जाता है।

इस समस्या को कम करने का सबसे अच्छा तरीका क्या है (और इसके साथ ही मेरा प्रत्येक घूर्णन आदि पर संपूर्ण तालिका दृश्य को फिर से लोड करने का मतलब नहीं है)? सेल के

उदाहरण नीचे जहां छाया सही ढंग से लागू किया जाता है: enter image description here

संपादित करें: enter image description here

नीचे स्क्रॉल के बाद ही tableview में सेल के नीचे (छाया केवल चौड़ाई के पहले 75% के लिए आवेदन): मैंने ध्यान दिया है मुद्दा कोड की इन पंक्तियों से कारण होता है:

CGRect shadowFrame = view.layer.bounds; 
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath; 
view.layer.shadowPath = shadowPath; 

अगर मैं le उन्हें बाहर निकालो, सबकुछ ठीक है। लेकिन मुझे बताया गया है कि इसका उपयोग करते समय कुछ प्रदर्शन लाभ है। किसी तरह छाया सही ढंग से घूर्णन के बाद नए आयाम के लिए लागू नहीं है ..

+0

ऐसा लगता है कि आप इस पर कॉल कर रहे सेल की सीमा सही आकार के लिए सेट किया गया है से पहले। आप ऑटो लेआउट उपयोग कर रहे हैं तो आप अपने 'UITableViewCell' उपवर्ग में layoutSubviews' अधिभावी' और 'बुला super.layoutSubviews() के बाद वहाँ बुला की कोशिश कर सकते' – beyowulf

+0

@beyowulf वास्तव में यह पहले से ही है UITableViewCell की एक sublclass और इस विधि layoutSubViews से कहा जाता है । मैंने इसे छाया पथ लगाने के लिए नीचे खोज लिया है, संपादन देखें। – edwardmp

उत्तर

5

आप सेल के फ्रेम कर रहे हैं के लिए आप सेटर ओवरराइड और addShadowToView: कॉल कर सकते हैं। आप अपने सेल के आकार भंडारण और केवल छाया पथ को अपडेट करके यह अधिक अनुकूलन कर सकते हैं जब उदाहरण के लिए आकार परिवर्तन:

@property (nonatomic, assign) CGSize size; 

और

- (void) setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 
    // Need to check make sure this subview has been initialized 
    if(self.subviewThatNeedsShadow != nil && !CGSizeEqualToSize(self.size,_frame.size) 
    { 
     [self addShadowToView: self.subviewThatNeedsShadow]; 
    } 
} 
+0

महान काम करता है (कि _frame अलग = फ्रेम [सुपर setFrame: फ्रेम] होने की जरूरत है), धन्यवाद। क्या मैं अभी भी समझ में नहीं आता क्यों यह काम करता है और 'में layoutSubviews' नहीं हुआ, क्योंकि मैं देख रहा हूँ इस विधि पर एक अलग फ्रेम के साथ डिवाइस रोटेशन बुलाया जा रहा है छाया लागू करने के लिए है। – edwardmp

+0

कई लोगों को लगता है कि 'layoutSubviews' सीधे' viewDidLayoutSubviews' (अर्थात कि लेआउट इंजन के हर पास के बाद कहा जाता है) यह स्थिति नहीं है के अनुरूप है। जब इसे देखा जाता है तो संक्षिप्त संक्षेप के लिए [यहां] देखें (http://stackoverflow.com/a/9983584/5442445)। – beyowulf

1

सबसे आसान समाधान UITableViewCell के को छाया जोड़ने के लिए है सामग्री देखें (सेल के बैकिंग व्यू के लिए परत बनाम)। चूंकि सेल की सीमा स्क्रॉल पर बदलती है, यदि आप मूल दृश्य में छाया जोड़ते हैं तो आपको प्रत्येक स्क्रॉल ईवेंट पर छाया का पथ अपडेट करना होगा जो महंगा और आवश्यक नहीं होगा।

आप निश्चित रूप से सही हैं: प्रदर्शन स्पष्ट रूप से छायापाथ को सेट नहीं कर रहा है। यदि आपके पास सेल के भीतर कोई एनिमेटेड सामग्री नहीं है, तो मैं प्रदर्शन को बेहतर बनाने के लिए इसे रास्टरराइज करने की भी सिफारिश करता हूं।

संपादित करें: आपको यह भी सुनिश्चित करना होगा कि जब आप छाया पथ सेट करते हैं तो सामग्री दृश्य की सीमाएं उनकी 'अंतिम' स्थिति में होती हैं। यदि सेल का आकार बाद में संशोधित किया गया है, तो इसके परिणामस्वरूप सामग्री दृश्य की सीमाएं बदल रही हैं और इस प्रकार एक गलत छायापथ है। इसका समाधान UITableViewCell के पथ को अद्यतन करना है - लेआउट सबव्यूव्यू विधि।

+0

छाया को सबव्यू में जोड़ा जाना चाहिए, न कि पूरे सेल (contentView)। मैं पहले से ही लेआउट सबव्यूव्स में पथ अद्यतन कर रहा हूं। – edwardmp

0

यहां चिंता माता-पिता दृश्य फ्रेम नहीं है, जहां यहां आपकी कामकाजी चिंता इसके उपन्यास है और इसका आकार लेआउट बदलते समय बदला जाना चाहिए। आप नीचे दी गई विधि को ओवरराइड कर सकते हैं जो आपको लेआउट बदलने पर सही फ्रेम सेट करने में मदद करेगा।

public override void LayoutSublayersOfLayer(CALayer layer) 
{ 

    base.LayoutSublayersOfLayer(layer); 
    if (layer.Name == "gradient") 
    { 
      layer.Frame = view.Layer.Frame; 
    } 
} 

ऊपर कोड view में जहां sublayer जोड़ा है। यदि आप विशेष परत पर काम करने के लिए पहचानकर्ता name संपत्ति का उपयोग कर सकते हैं तो आप एक ही दृश्य में एकाधिक परतों के साथ खेल रहे हैं।

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