呈现另一个 UIViewController 时 UIView 动画暂停

Posted

技术标签:

【中文标题】呈现另一个 UIViewController 时 UIView 动画暂停【英文标题】:UIView animation getting paused when another UIViewController is presented 【发布时间】:2017-12-01 20:05:42 【问题描述】:

我有一个 UITabBarController 作为我的应用程序的 rootViewController。当开始下载时,我会在最后一个标签上显示一个徽章,并让它以脉冲颜色显示正在下载:

- (void)incrementBadgeValue 

    UITabBarItem *moreTabBarItem = [self.tabBar.items lastObject];
    moreTabBarItem.badgeValue = @"↓";

    self.originalColor = moreTabBarItem.badgeColor.copy;
    UIColor *toColor = [UIColor darkGrayColor];
    NSTimeInterval duration = 1.5f;

    [UIView animateWithDuration:duration
                          delay:0.0
                        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut
                     animations:^

                         moreTabBarItem.badgeColor = toColor;

                      completion:^(BOOL finished) 
                         if (finished) 
                             moreTabBarItem.badgeColor = self.originalColor;
                         
                     ];


这很好用,直到另一个UIViewController 出现在窗口上,或者用户离开并返回应用程序。在这些情况下,动画会暂停/停止。

在这种情况下我该如何继续这个动画?

【问题讨论】:

【参考方案1】:

我也有同样的问题。解决它

创建UITabBarController(名称CustomTabBarController)的子类 重写 viewWillAppear 方法以在另一个 UIViewController 出现在窗口上或用户离开并返回应用程序时停止动画 重写 viewDidDisappear 方法以检查并在需要时继续动画。 如果你不能把动画代码放在CustomTabBarController里面。创建一个delegate 并在您的控制器类上使用它

CustomTabBarController

@protocol CustomTabBarDelegate<NSObject>

- (void)tabBarWillAppear;
- (void)tabBarDidDisappear;

@end

@interface CustomTabBarController : UITabBarController

@property(nonatomic, weak) id<CustomTabBarDelegate> customDelegate;

@end

@implementation CustomTabBarController

- (void)viewWillAppear:(BOOL)animated 
  [super viewWillAppear:animated];

  [self.customDelegate tabBarWillAppear];


- (void)viewDidDisappear:(BOOL)animated 
  [super viewDidDisappear:animated];

  [self.customDelegate tabBarDidDisappear];


@end

YourViewController

@interface YourViewController () <CustomTabBarDelegate>

@end

@implementation YourViewController

- (void)viewDidLoad 
  [super viewDidLoad];

  [(CustomTabBarController*)self.tabBarController setCustomDelegate:self];


- (void)tabBarWillAppear 
  if (/*Still need animation*/) 
    [self incrementBadgeValue];
  


- (void)tabBarDidDisappear 
  // Remove your animation


@end

【讨论】:

以上是关于呈现另一个 UIViewController 时 UIView 动画暂停的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 UIViewController 中呈现一个 UIViewController?

如何在将 UIViewController 呈现给自定义时更改默认转换

UIViewController 由于另一个最近被解雇而没有被呈现

从另一个 ViewController 呈现故事板 ViewController

模态呈现的 UIViewController 背景颜色随机变化

关闭时停止 UIViewController 动画