2013-02-27 28 views
7

मेरे पास एक सरल ट्रांसफॉर्म आधारित एनीमेशन करने के लिए एक एनीमेशन ब्लॉक है, जो पूरा होने पर दृश्य को अपने पर्यवेक्षण से प्रश्न में हटा देता है।UIView एनीमेशन ब्लॉक एनीमेशन और समापन कोड दोनों को रोकें

UIView *msgView = [[UIView alloc] initWithFrame:CGRectMake(160, 120, 160, 100)]; 

// Do stuff to set up the subviews of msgView. 

// Add the msgView to the superview (ViewController) that is going to display it. 

CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0); 

[UIView animateWithDuration:5.0 
       animations:^(void){msgView.layer.transform = transform;} 
       completion:^(BOOL finished){[msgView removeFromSuperview];}]; 

मैं तो के रूप में टेक क्यू & द्वारा विस्तृत एक 1673 http://developer.apple.com/library/ios/#qa/qa1673/_index.html एनीमेशन को रोकने के लिए कोड का उपयोग करें।

-(void)pauseLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
} 

-(void)resumeLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer timeOffset]; 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = timeSincePause; 
} 

हालांकि, यह कोड निष्पादन कोड को निष्पादित करने से नहीं रोकता है। तो मैं यह करने के लिए पूरा करने के लिए कोड बदलने को क्रियान्वित करने से कोड को रोकने के लिए: == समाप्त हो गया के लिए जाँच सही जबकि

completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];}; 

निष्पादित किया जा रहा है जबकि एनीमेशन ब्लॉक रोक दिया गया है से पूरा होने के कोड से बचाता है। यदि एनीमेशन को "अनपॉज़" करने से पहले अवधि का समय अब ​​खत्म हो गया है, तो समापन कोड निष्पादित नहीं किया जाएगा। यानी इस मामले में msgView पर्यवेक्षण में बनी हुई है।

क्या पूरा करने के साथ जुड़े एनीमेशन और टाइमर दोनों को रोक/रोकना है (यदि यह हो रहा है)?

+1

दिलचस्प सवाल। आईओएस में एक बग के रूप में समझा जा सकता है। इस समस्या को हल करने के लिए, मेरा सुझाव है कि आप अपने एनीमेशन के पूरा होने वाले टुकड़े से छुटकारा पाएं, और इसके बजाय अपने वर्तमान एनएसटीमर को अपने वर्तमान समापन के साथ अपना आविष्कार बनाएं। इस तरह आप अपने टाइमर को रोकें परत के अंदर रोक सकते हैं (भविष्य में फायरडेट को दूर करके)। अंदरूनी रेज़्यूमेलेयर आप फायरडेट को रीसेट कर सकते हैं (टाइमसेन्सपॉज़ + 5.0) – Rikkles

+0

मैं पूरा होने के साथ सीएएमडिया टिमिंग पर सीधे प्राप्त करने की उम्मीद कर रहा था, उसी तरह हम परत के साथ करते हैं। मुझे लगता है कि यह एक बेहतर समाधान होगा। – VariableSquid

+0

मैंने आईओएस 6.1 के तहत एक टेस्ट ऐप लिखा और यह सही ढंग से व्यवहार कर रहा है, यानी ट्रांसफॉर्म के टाइमर विराम। आप किस ओएस के तहत परीक्षण कर रहे हैं? – Rikkles

उत्तर

5

जैसा कि मैंने उपर्युक्त टिप्पणियों में कहा था, वहां कोई समस्या नहीं प्रतीत होती है। आईओएस 5.1 और 6.1 में नीचे परीक्षण किया गया है।

UIImageView *transView और UIButton *trigger के साथ एक स्टोरीबोर्ड बनाएं। यहाँ वर्ग है:

TSTViewController.h:

@property (weak, nonatomic) IBOutlet UIImageView *transView; 
@property (weak, nonatomic) IBOutlet UIButton *trigger; 
@property (nonatomic) NSUInteger bState; 

- (IBAction)didPressTrigger:(id)sender; 

TSTViewController.m:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.bState = 0; // 0 is initial state 
         // 1 is transform being animated 
         // 2 is transform paused 
         // 3 is transform ended 
} 

- (IBAction)didPressTrigger:(id)sender { 
    switch (self.bState) { 
     case 0: 
     { 
      CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0); 
      self.bState++; 
      [UIView animateWithDuration:5.0 
          animations:^(void){self.transView.layer.transform = transform;} 
          completion:^(BOOL finished){ 
           self.bState = 3; 
           NSLog(@"Done"); 
          }]; 
      break; 
     } 
     case 1: 
     { 
      self.bState++; 
      [self pauseLayer:self.transView.layer]; 
      break; 
     } 
     case 2: 
     { 
      self.bState = 1; 
      [self resumeLayer:self.transView.layer]; 
      break; 
     } 
     case 3: 
     { 
      [UIView animateWithDuration:0 animations:^(void){self.transView.layer.transform = CATransform3DIdentity;} 
          completion:^(BOOL finished) { 
           self.bState = 0; 
           NSLog(@"Reset"); 
          }]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

-(void)pauseLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
} 

-(void)resumeLayer:(CALayer*)layer 
{ 
    CFTimeInterval pausedTime = [layer timeOffset]; 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = timeSincePause; 
} 

जब आप ट्रिगर बटन दबाते हैं, एनीमेशन शुरू होता है। इसे फिर से दबाएं, एनीमेशन बंद हो जाता है। 10 सेकंड प्रतीक्षा करें, और फिर भी बटन दबाएं। एनीमेशन जारी रहता है और खत्म होता है, और यह "हो गया" लॉग करता है।

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