2011-02-17 12 views
14

मैं यूआईएलएबल पर पाठ को रंग से एनिमेट करने की कोशिश कर रहा हूं: [काला] से [सफेद] तक [काला] और दोहराना।एक स्पंदन UILabel एनिमेटिंग?

- (void)timerFlash:(NSTimer *)timer { 
[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:0.0]]; 
[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationOptionAllowUserInteraction 
       animations:^{[[self navTitle] setTextColor:[[UIColor whiteColor] colorWithAlphaComponent:1.0]];} 
       completion:nil]; 
} 

[self setFadeTimer:[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFlash:) userInfo:nil repeats:YES]]; 

सबसे पहले मैं अपने विधि के बारे में सुनिश्चित नहीं हूँ, मेरी योजना (आप ऊपर देख सकते हैं) एक एनीमेशन ब्लॉक की स्थापना की और एक दोहरा NSTimer का उपयोग कर इसे कहते हैं जब तक रद्द कर दिया गया था।

मेरी दूसरी समस्या (जैसा कि आप ऊपर देख सकते हैं) यह है कि मैं काला (अल्फा 0) से सफेद (अल्फा 1) से एनिमेट कर रहा हूं लेकिन मुझे नहीं पता कि काले रंग में फिर से एनिमेट कैसे करें ताकि एनीमेशन लापरवाही से

अनिवार्य रूप से जो मैं चाहता हूं वह यूआईएलएबल पर पल्स के लिए पाठ रंग है जब तक कि उपयोगकर्ता जारी रखने के लिए बटन दबाए।

EDIT_001:

मैं मुसीबत में हो रही थी क्योंकि आप चेतन नहीं कर सकते [UILabel setColor:] क्या आप फिर भी एनिमेटेड जा सकता है [UILabel setAlpha:] तो मुझे लगता है कि एक जाना देने जा रहा हूँ।

EDIT_002:

- (void)timerFlash:(NSTimer *)timer { 
    [[self navTitle] setAlpha:0.5]; 
    [UIView animateWithDuration:2 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{[[self navTitle] setAlpha:0.9];} 
        completion:nil]; 
} 

यह काम करता है: केवल एक चीज है कि इस midGray से करने के लिए एनिमेट है (BTW मैं इसे रोकने के लिए जो है क्यों मैं इसे एक NSTimer को झुका तो मुझे लगा कि रद्द कर सकते हैं करना चाहते हैं) के पास और फिर वापस पॉप। क्या किसी को पता है कि मैं कैसे नज़दीक से मिडग्रे से वापस एनिमेट करूँगा, इसलिए मुझे एक अच्छा चिकना चक्र मिलता है? enter image description here

EDIT_003: (समाधान)

कोड डेव डीलॉन्ग (नीचे देखें) जब CALayer अस्पष्टता शैली विशेषता का उपयोग करने के लिए संशोधित वास्तव में काम करता है ने सुझाव दिया:

UILabel *navTitle; 
@property(nonatomic, retain) UILabel *navTitle; 

// ADD ANIMATION 
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
[anim setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[anim setFromValue:[NSNumber numberWithFloat:0.5]]; 
[anim setToValue:[NSNumber numberWithFloat:1.0]]; 
[anim setAutoreverses:YES]; 
[anim setDuration:0.5]; 
[[[self navTitle] layer] addAnimation:anim forKey:@"flash"]; 

// REMOVE ANIMATION 
[[[self navTitle] layer] removeAnimationForKey:@"flash"]; 
+0

मैं कर रहा हूँ 100% आश्वस्त नहीं है कि animateWithDuration के रूप में मैं कर सकते हैं NSTimer साथ काम करता है किसी भी एनीमेशन के साथ एक रंग से दूसरे तक पॉप के अलावा कुछ भी करने के लिए यह नहीं मिलता है। – fuzzygoat

उत्तर

15

आप शायद इसे CAAnimation के साथ कर सकते हैं। मैंने थोड़ा सा डेमो प्रोजेक्ट धक्का दिया जो मैंने थोड़ी देर पहले जिथब पर किया था। यह ओलंपिक लोगो दिखाता है, और अंगूठियां स्क्रीन पर एक यादृच्छिक स्थान पर उड़ती हैं, फिर अपनी मूल स्थिति पर एनिमेट करती हैं। आप शायद कुछ ऐसा ही कर सकते हैं, लेकिन जाहिर है कि position संपत्ति का उपयोग नहीं कर रहा है।

यहाँ के छल्ले में से एक में उड़ते हैं बनाने के लिए बुनियादी कोड है:

CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"]; 
[a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[a setFromValue:[NSValue valueWithCGPoint:[layer position]]]; 
[a setToValue:[NSValue valueWithCGPoint:[self randomPoint]]]; 
[a setAutoreverses:YES]; 
[a setDuration:1.0]; 
[layer addAnimation:a forKey:nil]; 

आपका fromValue और toValue मूल्यों CGColorRefs होगा, और अपने एनीमेशन मुख्यपथ अलग होगा, लेकिन चाल यहाँ setAutoreverses:YES है। यह fromValue से toValue पर और फिर fromValue पर एनिमेट होगा। यह बहुत आसान आसान है।:)

https://github.com/davedelong/Demos/blob/master/OlympicRings


यदि वह काम नहीं करता है (और यह नहीं हो सकता है), तो मैं सिर्फ एक दूसरे के ऊपर पर दो UILabels परत और 0.0 से 1.0 के लिए अपने अल्फा मूल्यों चेतन हो सकता है (या इसके विपरीत) एक ही समय में।

+0

धन्यवाद डेव, मुझे एक नजर आएगी, मुझे यह भी लगता है कि UILabel की टेक्स्ट रंग संपत्ति एनिमेटेबल नहीं है, शायद यही कारण है कि मैं जो भी प्राप्त कर सकता हूं वह बहुत ही एनिमेटेड पॉपिंग है। – fuzzygoat

+0

हाय, मैं CoreAnimation से परिचित नहीं हूं, जो मैं देख सकता हूं कि सबसे अच्छा कीपैथ मान "अस्पष्टता" होगा, हालांकि मुझे UILabel या UIView पर प्रत्यक्ष अस्पष्टता नहीं मिल रही है, मुझे "अल्फा" का प्रयास करना पड़ सकता है लेकिन मैं मुझे यकीन नहीं है कि यह कैसे काम करेगा। [एक सेट फ्रॉमवैल्यू: [[स्वयं navTitle] setAlpha: 0.9]]; मैं अभी अपने काम कंप्यूटर पर नहीं हूं, मैं इसे बाद में कोशिश करूंगा ... – fuzzygoat

9

आप इसे अनिश्चित काल के लिए क्या करना चाहते हैं, तो आप डेव डीलॉन्ग के जवाब का उपयोग कर सकते हैं, या इस:

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationOptionAllowUserInteraction | 
          UIViewAnimationOptionAutoreverse | 
          UIViewAnimationOptionRepeat 
       animations:^{[[self navTitle] setTextColor:[UIColor whiteColor]];} 
       completion:nil]; 

CAAnimation का उपयोग कर, ज़ाहिर है, आप बाद में एनीमेशन को दूर कर सकते हैं का लाभ; इसके साथ, इसे रोकने के लिए आपको कैलियर में खोदना होगा और इसे रोकने के लिए एनीमेशन ढूंढना होगा।

आपने सुझाव दिया कि, UILabel.textColor एनिमेटेबल नहीं हो सकता है। यह एक संभावना है। यदि ऐसा है, तो आप अलग-अलग रंगों के दो UILabels के बीच संक्रमण के लिए इस तकनीक का उपयोग कर सकते हैं और केवल उनके अल्फा मूल्यों को फीका कर सकते हैं।

+0

धन्यवाद बीजे, मैं इसे रोकना चाहता हूं इसलिए मैंने इसे एनएसटीमर तक लगाया, इसलिए जब मैं पूरा हो गया तो टाइमर को मार सकता हूं। दिलचस्प विकल्प हालांकि, मैं निश्चित रूप से भविष्य के संदर्भ के लिए एक नोट बनाउंगा। – fuzzygoat

1

(समान यहाँ के रूप में Cancel block in UIView animateWithDuration)

मैं सिर्फ एनीमेशन दोहराने वाले और प्रेषण ब्लॉक के साथ कुछ समय के बाद यह मारने:

- (void)animate // Blink a view three times 
{ 
    // We need to stop the animation after a while (0.9 sec) 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void) 
    { 
     [view.layer removeAllAnimations]; 
     view.alpha = 0.0; // Animation clean-up 
    }); 

    [UIView animateWithDuration:0.15 // 0.15*6=0.9: It will animate six times (three in reverse) 
          delay:0.0 
         options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
        animations:^{ 
         view.alpha = 1.0; // Animation 
        } 
        completion:NULL]; 
}