2013-06-30 15 views
5

पर ऊपर जा रहा है मैं "चाहते हैं" iPhone एप्लिकेशन पृष्ठभूमि की नकल करना चाहते हैं चेतन करने के लिए, वहाँ 3 रंग है कि मैं एक के बाद एक के लिए एक दृश्य चाहते हैं, तो हमें लाल, नीले और हरे रंग का कहना है कि करते हैं।कैसे ढाल आईओएस

मैं चाहता हूं कि लाल से नीले रंग के हरे रंग के साथ एक ढाल हो, स्क्रीन के प्रत्येक 1/3, एक-दूसरे (ढाल) में फीका हो, फिर, मैं चाहते हैं कि लाल शीर्ष पर स्क्रीन से निकल जाए और वापस आएं बिल्कुल नीचे। (नीचे तस्वीरें देखें ...)

एनीमेशन ऊपर बढ़ना चाहिए, मैं ढाल बढ़ जाती हैं और स्क्रीन के तल पर सुधार और ऊपर जाने के लिए चाहते हैं।

मैं CAGradientLayer का उपयोग कर और "रंग" संपत्ति एनिमेट, लेकिन यह सब कुछ एक दूसरे में fades की तरह, जरूरी नहीं कि बंद स्क्रीन चलती लग रहा है की कोशिश की।

विचार ओपन का उपयोग कर, लेकिन कुछ है जो बहुत सरल लगता है के लिए है कि कम से जाने के लिए नहीं करना चाहती। किसी भी मदद/कोड नमूने की सराहना की जाएगी। मुझे मूल रूप से कोरएनीमेशन/कोरग्राफिक्स का उपयोग करके ढाल को एनिमेट करने में मदद की ज़रूरत है।

अग्रिम धन्यवाद!

enter image description here

enter image description here

enter image description here

उत्तर

5

एक CAGradientLayer की colors संपत्ति एनिमेट करना बस, एक फीका कारण होगा के रूप में आप की खोज की है। हालांकि मुझे लगता है कि एक ढाल परत जाने का रास्ता है। आप निम्न विकल्पों पर गौर करना चाहिए:

  • colors की positions संपत्ति एनिमेट रूप में अच्छी तरह/के रूप में के बजाय।
  • एक बड़ा ढाल परत है कि आपका पूरा एनीमेशन चक्र होता है बनाने और अपनी स्थिति को

के रूप में ढाल पुनर्गणना किए जाने की जरूरत नहीं होगी दूसरा विकल्प शायद सबसे अच्छा प्रदर्शन दे देंगे एनिमेट।

+0

ठीक है, तो मैं एक ढाल परत स्क्रीन से बड़ा (स्क्रीन ऊंचाई 3 गुना) बनाने की कोशिश की है, और उसके position.y एनिमेटेड, और यह, काम करता है position.y> स्क्रीन origin.y तक । क्या मैं एक और ढाल बना देता हूं और इसे पहले के नीचे रखता हूं, इसलिए यह अभी भी जारी रहता है, बड़ी ग्रेडियेंट परत स्क्रीन बंद होने के बाद आप एनीमेशन कैसे चलते हैं? मुझे लगता है कि एक सुपर लम्बाई के साथ केवल एक कैग्रेडिएंट लेयर बनाना और इसकी स्थिति को एनिमेट करना। यह जरूरी नहीं है कि जवाब, क्योंकि यह अभी भी अंततः समाप्त हो सकता है। मैं हमेशा के लिए एनिमेट करना चाहता हूँ। – Supereid86

+0

ठीक है, जब यह एक लूप बिंदु पर जाता है, तो आप स्थिति को शीर्ष पर (एनीमेशन के बिना) रीसेट कर देंगे फिर लूप फिर से करें। – jrturton

+0

एक आकर्षण की तरह काम किया। एक टिप्पणी- मुझे 2 कैग्राइडेंट लेयर, एक लाल-नीला-लाल और अन्य लाल-नीले-लाल बनाने की आवश्यकता थी।मैंने एक दूसरे के शीर्ष पर रखा (एक शीर्ष पर और पहले के अंत में शुरू होने वाला), मैंने स्थिति को एनिमेट किया। जब तक पहली बार स्क्रीन बंद नहीं हुई और दूसरा अब पहले की उत्पत्ति पर था। फिर मैंने बिना किसी एनीमेशन के दूसरे के नीचे पहला स्थानांतरित किया, और फिर स्थिति को एनिमेट किया। धन्यवाद @ jrtuton! – Supereid86

0

आप एक GradientView वर्ग बनाने के लिए UIView subclass चाहिए। जिन रंगों को आप आगे बढ़ रहे हैं उन्हें पकड़ने के लिए एक सरणी जोड़ें। चुनाव महत्वपूर्ण है और मैं इसकी वजह समझाने wrote an articledrawRect (रेक्ट: CGRect) ओवरराइड विधि और रंग की घटकों के बीच अंतर्वेशन:

override func drawRect(rect: CGRect) { 

    let context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 

    let c1 = colors[index == 0 ? (colors.count - 1) : index - 1] // previous 
    let c2 = colors[index]          // current 
    let c3 = colors[index == (colors.count - 1) ? 0 : index + 1] // next 

    var c1Comp = CGColorGetComponents(c1.CGColor) 
    var c2Comp = CGColorGetComponents(c2.CGColor) 
    var c3Comp = CGColorGetComponents(c3.CGColor) 

    var colorComponents = [ 
     c1Comp[0] * (1 - factor) + c2Comp[0] * factor, // color 1 and 2 
     c1Comp[1] * (1 - factor) + c2Comp[1] * factor, 
     c1Comp[2] * (1 - factor) + c2Comp[2] * factor, 
     c1Comp[3] * (1 - factor) + c2Comp[3] * factor, 
     c2Comp[0] * (1 - factor) + c3Comp[0] * factor, // color 2 and 3 
     c2Comp[1] * (1 - factor) + c3Comp[1] * factor, 
     c2Comp[2] * (1 - factor) + c3Comp[2] * factor, 
     c2Comp[3] * (1 - factor) + c3Comp[3] * factor  
    ] 

    let gradient = CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), &colorComponents, [0.0, 1.0], 2) 

    let startPoint = CGPoint(x: 0.0, y: 0.0) 
    let endPoint = CGPoint(x: rect.size.width, y: rect.size.height) 
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsAfterEndLocation) 

    CGContextRestoreGState(context); 
} 

सूचकांक चर 0 से शुरू होता है और रंग सरणी इर्द-गिर्द घूमती है, जबकि कारक 0.0 और 1.0 के बीच है और के माध्यम से एनिमेट एक टाइमर:

var index: Int = 0 
var factor: CGFloat = 1.0 
var timer: NSTimer? 

func animateToNextGradient() { 
    index = (index + 1) % colors.count 
    self.setNeedsDisplay() 
    self.factor = 0.0  
    self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0/60.0, target: self, selector: "animate:", userInfo: nil, repeats: true) 

} 

func animate(timer: NSTimer) { 
    self.factor += 0.02 
    if(self.factor > 1.0) { 
     self.timer?.invalidate() 
    } 
    self.setNeedsDisplay() 
} 
+1

यह आवश्यकतानुसार ढाल को एनिमेट करने के लिए प्रतीत नहीं होता है, मैंने आपके स्पीडो ऐप को देखा और एनीमेशन शानदार है, अगर आप ऐसा कर सकते हैं तो आप कैसे प्राप्त कर सकते हैं? – DrPatience

+1

मैंने कुछ ब्लॉग कोड के साथ अपने ब्लॉग पर आपके प्रश्न के बाद एक पोस्ट जोड़ा। कृपया देखें कि क्या आप चाहते हैं http://karmadust.com/animating-a-gradient-in-a-uiview/ –

+0

@ माइकएम यह लिंक अब काम नहीं करता है, क्या आपके पास दूसरा है? –

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