2010-09-29 10 views
3

Dans mon application iPhone, j'ai une vue UIScrollView avec des vues de contenu personnalisées. À certains endroits, une vue popup personnalisée est ajoutée dynamiquement au contenu avec une animation zoom apparaissant et disparaissant. J'utilise des animations à base de blocs avec un gestionnaire d'achèvement qui appelle [auto removeFromSuperView] comme suit:Gel de l'interface utilisateur avec suppression animée de la sous-vue UIScrollView

- (void)dismissPopup { 
    CGRect rect = self.frame; 
    rect.origin.y += rect.size.height/2 * (pointingDown ? 1 : -1); 
    [UIView animateWithDuration:kZoomDuration 
        animations:^{ 
         self.frame = rect; 
         self.transform = CGAffineTransformMakeScale(0.01, 0.01); 
        } 
        completion:^(BOOL finished) { 
         [self removeFromSuperview]; 
        }]; 
} 

La plupart du temps cela fonctionne, mais maintenant et de nouveau après cette animation l'interface utilisateur se verrouille complètement et ne répond pas à tout contact . Je suis à peu près sûr que cette animation source du problème comme avec le code d'animation a commenté que je n'ai pas pu le reproduire. Briser avec le débogueur, les trois fils semblent être inactif:

Thread-1 
#0 0x32fd1c98 in mach_msg_trap 
#1 0x32fd3d6a in mach_msg 
#2 0x34432c3e in __CFRunLoopServiceMachPort 
#3 0x344324c8 in __CFRunLoopRun 
#4 0x34432276 in CFRunLoopRunSpecific 
#5 0x3443217e in CFRunLoopRunInMode 
#6 0x3026b5f2 in GSEventRunModal 
#7 0x3026b69e in GSEventRun 
#8 0x31ad0122 in -[UIApplication _run] 
#9 0x31ace12e in UIApplicationMain 
#10 0x00002b06 in main at main.m:14 

Thread-2 
#0 0x32ffe330 in kevent 
#1 0x330a7b74 in _dispatch_mgr_invoke 
#2 0x330a75c4 in _dispatch_queue_invoke 
#3 0x330a7764 in _dispatch_worker_thread2 
#4 0x3304b680 in _pthread_wqthread 

Thread-3 
#0 0x32fd1c98 in mach_msg_trap 
#1 0x32fd3d6a in mach_msg 
#2 0x34432c3e in __CFRunLoopServiceMachPort 
#3 0x344324c8 in __CFRunLoopRun 
#4 0x34432276 in CFRunLoopRunSpecific 
#5 0x3443217e in CFRunLoopRunInMode 
#6 0x34b524e8 in RunWebThread 
#7 0x3304b284 in _pthread_start 

Instruments montre que mon application prend pas de temps CPU, il est donc une sorte d'impasse. Quelqu'un peut-il faire la lumière sur ce comportement, et comment l'éviter?

Mise à jour: J'ai encore creusé et utilisé l'API d'animation traditionnelle. Le bug semble également avoir disparu. Cela pourrait-il être un bug dans le nouveau framework d'animation?

- (void)dismissPopup { 
    CGRect rect = self.frame; 
    rect.origin.y += rect.size.height/2 * (pointingDown ? 1 : -1); 
    [UIView beginAnimations:@"dismissPopup" context:nil]; 
    [UIView setAnimationDuration:kZoomDuration]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
    self.frame = rect; 
    self.transform = CGAffineTransformMakeScale(0.01, 0.01); 
    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
    [self removeFromSuperview]; 
} 

Répondre

2

Vous devriez probablement essayer cette méthode pour votre animation: +animateWithDuration:delay:options:animations:completion:

avec des options: UIViewAnimationOptionAllowUserInteraction

0

Je ne sais pas si cela est de toute aide, mais je l'ai vu beaucoup d'animation à tout moment un comportement erratique (ou quoi que ce soit avec l'interface utilisateur pour cette matière est appelée à partir d'un autre thread que le thread principal) .. à assure ceci, j'appelle ma fonction d'animation comme ceci

[self performSelectorOnMainThread: @selector (animationFunctionGoesHere) avecObject: nil waitUntilDone: YES];

+0

Oui, vous devez faire toutes les opérations de l'interface utilisateur sur le thread principal. La méthode -dismissPopup ci-dessus est appelée sur le thread principal. –