2014-05-22 6 views
12

मैं अपने UIProgressView प्रगति को 10 सेकंड के दौरान 0 से 1 तक एनिमेट करना चाहता हूं।UIView एनिमेट विथडिशन और यूआईपी प्रोग्रेस व्यू सेट प्रोग्रेस

कोड:

[UIView animateWithDuration:10.0 animations:^{ 
    [_myProgressView setProgress:1 animated:YES]; 
} completion:(BOOL finished)^{ 
    if (finished) NSLog(@"animation finished); 
}]; 

एनीमेशन कि पूरा होने को छोड़कर ठीक काम कर रहा है और NSLog हमेशा तुरन्त कहा जाता है।

मैंने animateWithDuration: withDelay: की कोशिश की लेकिन देरी का सम्मान नहीं किया गया और तुरंत निष्पादित किया गया।

क्या किसी को भी एक ही समस्या का सामना करना पड़ा है?

आपकी मदद के लिए धन्यवाद।

+1

मुझे भी एक ही समस्या का सामना करना पड़ा और मुझे अभी तक कुछ समाधान नहीं मिला है जो प्रगति को एक अच्छे तरीके से एनिमेट करता है। क्या आपको कोई लापरवाही समाधान नहीं मिला? – EmilDo

+0

एमिलियो के साथ ही। क्या आपके पास एक अच्छा समाधान है – osrl

+0

http: // seanallen।सह/पोस्ट/एनिमेटेड-प्रोग्रेस-बार – iDev750

उत्तर

0

जो मैंने पाया वह यूआईवीव एनिमेशन और प्रगति दृश्य एनिमेटन दोनों का एक सेट है जो बहुत अच्छा काम करता है और प्रगतिशीलता को आसानी से एनिमेट करता है। यदि आप केवल एनीमेशन और प्रोग्रेसव्यू एनीमेशन के संयोजन का उपयोग करते हैं तो इसे UIview एनीमेशन टाइमर के संबंध में सीधे निकाल दिया जाता है।

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 1.0f 
              target: self 
              selector: @selector(updateTimer) 
              userInfo: nil 
              repeats: YES]; 
} 


- (void)updateTimer 
{ 
    if (progressView.progress >= 1.0) { 
     [timer invalidate]; 
    } 
    [UIView animateWithDuration:1 animations:^{ 
     float newProgress = [self.progressView progress] + 0.125; 
     [self.progressView setProgress:newProgress animated:YES]; 
    }]; 
} 

एनीमेशन समय समायोजित करने के लिए स्वतंत्र महसूस करने के लिए और भी बेहतर और एक निर्बाध संक्रमण

+0

प्रोटोटाइप ऐप –

1

यह एक पुराने सवाल है, लेकिन मैं एक ऐसी ही समस्या थी और यहां मेरे समाधान (खेद यह स्विफ्ट में है) है। एनीमेशन खत्म होने पर पूरा भाग कहा जाता है। यह एक कस्टम UIProgressView कक्षा के अंदर है।

override func setProgress(progress: Float, animated: Bool) { 

    self.progress = progress 
    if animated { 
     let duration: NSTimeInterval = 10.0 
     UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: { 
      self.layoutIfNeeded() 
      }, completion: { (completed) in 
       self.animationDuration = nil 
     }) 
    } else { 
     self.layoutIfNeeded() 
    } 
} 
3

यह आसान के बजाय तरह NSTimer का उपयोग करके,

[progressview setProgress:0 animated:NO]; 
NSTimer *t=[NSTimer scheduledTimerWithTimeInterval: 1.0f 
             target: self 
             selector: @selector(progressupdate) 
             userInfo: nil 
             repeats: YES]; 

नीचे समारोह जो प्रगति को अद्यतन करता है,

-(void)progressupdate{ 
    if(progressview.progress<1){ 
     [progressview setProgress:(progressview.progress+=0.2) animated:YES]; 
    } 
    else{ 
     [t invalidate]; 
    } 
} 

आशा है कि यह मदद करता है ....

21

यह एक पुरानी समस्या है लेकिन मैं अभी भी समाधान पोस्ट कर रहा हूं। समाधान वास्तव में सरल साबित हुआ। तुम सब करने की ज़रूरत है:

[_myProgressView setProgress:1]; 
[UIView animateWithDuration:10.0 animations:^{ 
    [_myProgressView layoutIfNeeded]; 
} completion:^(BOOL finished){ 
    if (finished) NSLog(@"animation finished"); 
}]; 

यहाँ क्यों बातें आप के लिए गलत तरीके से काम कर रहे थे के लिए एक अच्छा विवरण है: http://blog.spacemanlabs.com/2012/08/premature-completion-an-embarrassing-problem/

तो तुम प्रगति दृश्य चेतन करने के लिए setProgress:animated: विधि का उपयोग नहीं कर सकते हैं और अपने completion ब्लॉक के वांछित व्यवहार भी। हालांकि, ब्लॉक के अंदर बस progress सेट करना इसे एनिमेट नहीं करेगा, क्योंकि progress एक एनिमेटेबल प्रॉपर्टी नहीं है। https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/clm/UIView/animateWithDuration:animations:

संपत्ति animatable होने के लिए सेब प्रलेखन जो अपने आवश्यक कहते हैं का संदर्भ लें

तो आप बस चेतन ब्लॉक के बाहर progress संपत्ति के मूल्य को अद्यतन करने और चेतन ब्लॉक के अंदर देखने के लेआउट करना ।

+1

में उपयोग के लिए अच्छा उदाहरण यह सही उत्तर चिह्नित किया जाना चाहिए। – MrBr

+0

बहुत अच्छा है। इस मामले के लिए, आप शायद रैखिक समय वक्र का उपयोग करना चाहते हैं '[UIView एनिमेट करेंथिथेशन: 10.0 देरी: 0 विकल्प: UIViewAnimationOptionCurveLinear एनिमेशन:^{' – CupawnTae

+0

सही उत्तर,' UIView.animate (:) 'का उपयोग करके एनीमेशन एनिमेट करना गलत है और अंत में एनीमेशन परत रीसेट नहीं करता है। –

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