同步 UIView 动画

Posted

技术标签:

【中文标题】同步 UIView 动画【英文标题】:Synchronizing UIView animations 【发布时间】:2011-01-17 01:58:53 【问题描述】:

您好,为了响应触摸事件,我的应用程序确实会查看动画。如果用户真的很快并且即使在当前动画正在发生时也进行了另一次触摸,那么一切都会变得一团糟。

框架提供了处理这个问题的标准方法吗?还是我以错误的方式制作动画?

目前它正在检查一个标志 (animationInProgress) 来处理这个问题,但我想知道这是否是我们必须求助的?

代码如下:

- (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;

【问题讨论】:

【参考方案1】:

如您所见,框架的默认行为是允许任何事情同时发生(如果您愿意)。

如果您的目标是阻止已在运行的特定动画的发生,那么使用您正在做的标志是完全合理的。

如果您想在概念上“更上一层楼”并在动画期间完全阻止任何触摸事件进入您的应用程序,您可以使用:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

搭配:

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

【讨论】:

如果您在动画期间使用 begin/endIgnoringInteractionEvents 阻止任何触摸事件进入您的应用程序,那么在此块中可能到达的触摸事件会发生什么情况?一旦调用 endIgnoringInteractionEvents,它们会被缓存并呈现给应用程序,还是会丢弃所有触摸(顾名思义)? @vance:顾名思义,它们会被扔掉。

以上是关于同步 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIViewPropertyAnimator 同步动画 CALayer 属性和 UIView

UIView 动画与子视图同步

在 iOS7 中边缘滑动时,使键盘与 UIView 同步动画

iOS - 使用自动布局执行多个同步动画

与更改数组值同步更新 UIView

屏幕旋转不同步时旋转 UIView