【问题标题】:UIActivityIndicatorView keeps animating preceding CATransition pushViewControllerUIActivityIndi​​catorView 保持动画前面的 CATransition pushViewController
【发布时间】:2013-04-25 01:03:24
【问题描述】:

我正在尝试停止 UIActivityIndi​​catorView 上的动画,方法与使用 CATransition 淡入淡出推送视图控制器的方法相同。

UIActivityIndi​​catorView 不会停止动画,然后淡入下一个视图控制器,而是在整个淡入淡出过程中继续设置动画,无论我设置多长时间。

任何想法如何让旋转停止,然后以相同的方法推动/淡入淡出?

- (void)pushView:(NSNotification *)notification {

    [self.activityIndicator stopAnimating];
    NextViewController* nextViewController = [[NextViewController alloc] init];
    CATransition *transition = [CATransition animation];
    transition.duration = 1.5f;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];
    [self.navigationController pushViewController:nextViewController animated:NO];

}

编辑 1

与大卫的回答相同,如果我使用 dispatch_after 并延迟了几分之一秒,我就能够成功 stopAnimating。有没有更好的方法来做到这一点?:

- (void)pushView:(NSNotification *)notification {

    [self.activityIndicator stopAnimating];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.0001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){
        NextViewController* nextViewController = [[NextViewController alloc] init];
        CATransition *transition = [CATransition animation];
        transition.duration = 1.5f;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionFade;
        [self.navigationController.view.layer addAnimation:transition forKey:nil];
        [self.navigationController pushViewController:nextViewController animated:NO];
    });
}

【问题讨论】:

    标签: objective-c uiactivityindicatorview catransition


    【解决方案1】:

    我以前遇到过类似的事情。您正在运行的称为同步执行。在同步执行中,UI 不会更新,直到编译器终止函数,也就是 }。你如何解决这个问题?简单的。只需在异步调度中运行任何方法来更新 UI:

    - (void)pushView:(NSNotification *)notification {
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
    
    dispatch_async(dispatch_get_main_queue(), ^(void){
        [self.activityIndicator stopAnimating];
    });
    
    NextViewController* nextViewController = [[NextViewController alloc] init];
    CATransition *transition = [CATransition animation];
    transition.duration = 1.5f;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];
    [self.navigationController pushViewController:nextViewController animated:NO];
    
    });
    
    }
    

    哎呀!我忘了把其他代码放在一个简单的调度中!尝试编辑后的代码,它应该可以工作!

    这样[self.activityIndicator stopAnimating]; 在优先级线程上运行,而函数中的其余代码在默认优先级线程中运行,以您期望的方式有效地同时运行代码。

    干杯!

    【讨论】:

    • 感谢您的回复,大卫。不幸的是dispatch_async 对我不起作用。但是,如果我使用dispatch_after 延迟转换块的执行,只需几分之一秒,stopAnimating 就会按预期运行。我编辑了我的问题以显示我如何修改我的代码。必须有更好的方法......
    • 检查编辑的代码。我忘了在默认队列上分派整个事情。
    • 所以 activityIndi​​cator 现在停止动画,但视图没有推动......:/有什么想法吗?无论哪种方式,我都感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多