2013-03-22 8 views
13

मैं एक दृश्य में CAGradientLayer जोड़ रहा हूं। जब दृश्य स्वतः आकार बदलता है (जैसे घूर्णन के बाद) ढाल परत का आकार बदल नहीं जाता है। क्या ढाल को दृश्य के रूप में ऑटो-आकार बदलने के लिए सेट किया जा सकता है? ध्यान दें कि मैं दृश्य में ऑटो-लेआउट बाधाओं का उपयोग कर रहा हूं।रोटेशन के बाद कैग्रेडिएंट लेयर का आकार कैसे बदलें?

यहाँ मैं क्या कर रहा है:

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
    gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height); 
    gradientLayer.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor], 
         (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil]; 

    [self.layer insertSublayer:gradientLayer atIndex:0]; 
+0

संभावित डुप्लिकेट [सीएएलएयर ऑटोरेसाइजिंग मास्क आईओएस एसडीके के लिए नहीं है?] (Http://stackoverflow.com/questions/8600826/calayer-autoresizingmask-not-for-ios-sdk) – CodaFi

+0

@ कोडाफ़ी थोड़ा अलग सवाल। इसके अलावा, हालांकि उस प्रश्न के लिए एक स्वीकार्य उत्तर है, यह इस मामले के लिए प्रतीत होता है। – memmons

+2

आप सही हैं, वह जवाब बेकार है। '-layoutSubviews' ओवरराइड करें और वहां अपने फ्रेम असाइन करें। – CodaFi

उत्तर

24

यहाँ आपकी समस्या को ठीक करने के लिए दो अलग-अलग तरीके हैं।

  1. gradientLayer स्थानीय चर के बजाय एक उदाहरण चर बनाओ। फिर, ढाल परत के फ्रेम स्थापित करने के लिए अपने दृष्टिकोण को कक्षा में layoutSubviews ओवरराइड:

    - (void)layoutSubviews { 
        [super layoutSubviews]; 
        _gradientLayer.frame = self.bounds; 
    } 
    
  2. UIViewGradientView नामित की एक उपवर्ग बनाएँ, और [CAGradientLayer class] वापस जाने के लिए अपने +layerClass विधि ओवरराइड। सीधे एक परत का उपयोग करने के बजाय अपने ढाल को आकर्षित करने के लिए इस दृश्य का उपयोग करें। फिर ढाल दृश्य का autoresizingMask सेट करें (या यदि आप ऑटो लेआउट का उपयोग कर रहे हैं तो इसमें बाधाएं जोड़ें)। उदाहरण के लिए See this answer

GradientView वर्ग बनाना भी आकार बदलने रोटेशन के दौरान ठीक से व्यवहार कर देगा, इसलिए मुझे लगता है कि समाधान सलाह देते हैं।

+0

♡ जुड़ा हुआ उत्तर। समस्या का महान स्पष्टीकरण (एनिमेटेड gif!) और समाधान के साथ। बहुत बढ़िया। – memmons

+0

शामिल लिंक ने स्पष्टीकरण सुपर सरल बनाया! धन्यवाद रॉब! –

2

मैं देखने के setFrame: विधि अधिभावी द्वारा मैन्युअल रूप से परत के परिबंधों आकार परिवर्तन:

-(void)setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 
    _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)); 
} 
+0

'setFrame: दुर्भाग्य से रोटेशन जैसी घटनाओं के दौरान नहीं कहा जाता है, इसलिए यह काम नहीं करेगा। – memmons

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