2011-01-17 40 views
7

Hi başvurum görünümü animasyon yapar, olayları dokunmak. Kullanıcı gerçekten hızlıysa ve mevcut animasyon olsa bile başka bir dokunuş yaparsa, her şey berbat olur.Senkronizasyon UIView animasyonlar

çerçevesi tarafından sağlanan bu sorunu ele almak standart bir yol var mı? Yoksa animasyonu yanlış mı yapıyorum?

Şu an için bu işlemek için bir bayrak (animationInProgress) kontrol ediyor ama bu bunun için başvurmak zorunda buysa bilmek istedi? Fark olarak

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
    NSMutableArray *c = (NSMutableArray*)context; 
    UINavigationController *nc = [c objectAtIndex:0]; 
    [nc.view removeFromSuperview]; 
    animationInProgress = NO; 
} 

- (void)transitionViews:(BOOL)topToBottom { 
    if (animationInProgress) { 
     return; 
    } 
    animationInProgress = YES; 
    NSMutableArray *context = [[NSMutableArray alloc] init]; 
    [UIView beginAnimations:@"myanim" context:context]; 
    [UIView setAnimationDuration:0.7f]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

    UIViewController *from; 
    UIViewController *to; 
    if (navController3.view.superview == nil) { 
     from = navController2; 
     to = navController3; 
    } else { 
     from = navController3; 
     to = navController2; 
    } 

    int height; 
    if (topToBottom) { 
     height = -1 * from.view.bounds.size.height; 
    } else { 
     height = from.view.bounds.size.height; 
    } 

    CGAffineTransform transform = from.view.transform; 

    [UIView setAnimationsEnabled:NO]; 
    to.view.bounds = from.view.layer.bounds; 
    to.view.transform = CGAffineTransformTranslate(transform, 0, height); 
    [window addSubview:to.view]; 

    [UIView setAnimationsEnabled:YES]; 
    from.view.transform = CGAffineTransformTranslate(from.view.transform, 0, -1 * height); 
    to.view.transform = transform; 

    [context addObject:from]; 

    [UIView commitAnimations]; 

    return; 
} 

cevap

10

çerçeveler varsayılan davranış, siz istediğiniz takdirde şey aynı anda olmasına izin etmektir: Burada

kodudur. Amacınız zaten çalışıyorsa eğer olmasını spesifik bir animasyon engellemek için ise yaptığınızı gibi bir bayrak kullanma

mükemmel makul. Bu kadar "bir seviyede yukarı" kavramsal ve animasyon sırasında tüm başvurunuzu girmesini herhangi dokunmatik olaylarını durdurmak istiyorsanız

, şunları kullanabilirsiniz:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

bir ile eşleştirilmiş:

[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
Bu blokta ise gelmesi olabilir dokunmatik olayları ile ne
+0

sen/endIgnoringInteractionEvents başlamak kullanarak animasyon sırasında başvurunuzu girmesini herhangi dokunmatik olaylarını durdurmak için,? Onlar önbelleğe alınacak ve bir kez sunulduktan sonra appIgnoringInteractionEvents çağrılacak mı yoksa tüm dokunuşları (isminden de anlaşılacağı gibi) atar mı? – vance

+0

@vance: Adından da anlaşılacağı gibi, atılacaklar. –