如何在没有navigationController的viewController中制作CAAnimation

Posted

技术标签:

【中文标题】如何在没有navigationController的viewController中制作CAAnimation【英文标题】:How to make CAAnimation in viewController, which presented without navigationController 【发布时间】:2016-03-30 12:42:34 【问题描述】:

在我的代码中,新的 viewcontroller 没有被推送到导航控制器中,而是作为小部件呈现。

-(void) loadBlurWidgetsWithClass:(Class) widgetClass andXib:(NSString*) xibName options:(NSDictionary *)options completion:(void (^)(void))competionBlock


     [self unloadBlurWidgetsRemovingView:NO];

     self.blurViewController = [[widgetClass alloc] initWithNibName:xibName bundle:nil options:options];
     [self.navigationItem.leftBarButtonItem setEnabled:NO];
     [self.blurViewController.view setBounds:self.view.bounds];
     [self.view addSubview:self.blurViewController.view];
     [self.blurViewController.view removeFromSuperview];

     self.blurViewController.main = self;

     [self showBlurViewDynamic:[options[@"dynamic"] boolValue] WithCompletion:^
     for(UIView* v in self.blurViewController.view.subviews)
     
          [_blurView addSubview:v];
     
     if (competionBlock) 
          competionBlock();
     
];

因此,新类 viewWillAppear 和 viewDidAppear 不会被触发。但是在课堂上我想使用动画,我必须在 viewDidAppear 中初始化。你有一个解决方案我可以如何调用 viewDidAppear 或者我应该如何制作动画。提前谢谢你。

【问题讨论】:

我认为您应该调用该视图控制器的 didMoveToParentViewController: 方法,并将视图控制器作为参数呈现。 【参考方案1】:

你需要添加self.blurViewController's 视图作为子视图而不是它的子视图, 为了调用viewWillAppearviewDidAppear 视图控制器视图应该在那里,但是你正在做[self.blurViewController.view removeFromSuperview]; 这一行删除了视图控制器视图视图控制器中没有视图以便调用将/确实出现方法。如果您想调用这些方法,请不要删除视图控制器的主视图,如果您不想要主视图控制器的视图,那么您可以将其背景颜色设置为清除或 alpha 为零或略高于零。

 self.blurViewController = [[widgetClass alloc] initWithNibName:xibName bundle:nil options:options];
 [self.navigationItem.leftBarButtonItem setEnabled:NO];
 [self.blurViewController.view setBounds:self.view.bounds];
 [self.view addSubview:self.blurViewController.view];
// [self.blurViewController.view removeFromSuperview]; 
 [self.blurViewController.view.alpha = 0.2f;
 //or
 //self.blurViewController.view.backgroundColor = [UIColor clearColor];
 [self showBlurViewDynamic:[options[@"dynamic"] boolValue] WithCompletion:^
      [_blurView addSubview:self.blurViewController.view];
      if (competionBlock) 
      competionBlock();
 ];

【讨论】:

这些通过调用将/确实出现来决定我的问题,但在这种情况下我还有另一个问题,[self.blurViewController.view removeFromSuperview];应该在场。我创建了另一个使用 beginAppearanceTransition 和 endAppearanceTransition 调用显示函数的解决方案。它的工作,但我不知道在哪里调用这个函数。 那里的方法你不需要调用,系统会被调用,你只需要实现这些方法 "声明 - (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated 如果子视图控制器的视图即将添加到视图层次结构中,则为 YES,如果正在移除,则为 NO。如果您正在实现自定义容器控制器,请使用此方法告诉孩子它的视图即将出现或消失。不要直接调用 viewWillAppear:、viewWillDisappear:、viewDidAppear: 或 viewDidDisappear:。它不存在意味着调用“beginAppearanceTransition”时调用了“viewDidLoad”? "如果你正在实现一个自定义的容器控制器,使用这个方法告诉孩子它的视图即将出现或消失。不要调用 viewWillAppear:、viewWillDisappear:、viewDidAppear: 或 viewDidDisappear:直接地。”它说你不需要调用做/将出现方法,它将由视图控制器自动调用,并且视图控制器调用viewDidload方法来设置你添加到视图控制器的所有视图。只有在viewDidLoad 方法您可以访问所有其他子视图,这将转到所有已初始化并准备显示的视图

以上是关于如何在没有navigationController的viewController中制作CAAnimation的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有警告和错误的闭包内使用 navigationController?.popViewController(animated: true)?

如何将导航栏(没有 NavigationController)和搜索栏添加到 TableView

展开到没有 NavigationController 的特定 ViewController

如何在 iPad 中将 UIModalPresentationFormSheet 与 NavigationController 一起使用?

在 Swift 3 中使用 didSelect 和 navigationController 在没有情节提要的情况下在 TableViewControllers 之间传递数据

阻止用户返回 NavigationController