为啥我在使用这个 UIView 动画块时会看到生涩的动画?

Posted

技术标签:

【中文标题】为啥我在使用这个 UIView 动画块时会看到生涩的动画?【英文标题】:Why do I see jerky animation when using this UIView animation block?为什么我在使用这个 UIView 动画块时会看到生涩的动画? 【发布时间】:2011-05-16 19:17:29 【问题描述】:

我有一个在应用程序委托中创建的标签栏。通过从选项卡栏加载的视图之一单击按钮调用操作表单,我打开了帮助屏幕,但加载后有一个抽搐动作。

请原谅我的非正式发言。过去几个小时我一直在努力解决这个问题。

-(void)flipToHelp 
 HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
 [self setHelpViewController:helpVariable];
 [UIView beginAnimations:@"flipview" context:nil]; 
 [UIView setAnimationDuration:0.5];
 [UIView setAnimationCurve:UIViewAnimationCurveLinear];
 [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
 forView:_window cache:YES];

[_window removeFromSuperview];
[helpVariable release];
self.window.rootViewController = self.HelpViewController;
[UIView commitAnimations];

【问题讨论】:

你为什么打电话给[_window removeFromSuperview]?您不应该从窗口中删除标签栏控制器吗? 我试过了,但使用“self.window = self.HelpViewController;”时一直出错...警告:语义问题:从“HelpViewController *”分配给“UIWindow *”的指针类型不兼容 我不确定重新分配 rootViewController 是否会改变视图。如果是这样,您需要做的就是删除[_window removeFromSuperview] 行。如果更改 rootViewController 还不够,可以这样做:[self.tabBarController removeFromSuperview]; [self.window addSubview:self.HelpViewController.view]; 哇!删除 [_window removeFromSuperview]; 并添加 [self.window addSubview:self.HelpViewController.view]; 成功了!我无法添加[self.tabBarController removeFromSuperview]; 要恢复主屏幕我做了这个[self.HelpViewController.view setHidden:1]; [self.HelpViewController.view removeFromSuperview]; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; [UIView commitAnimations]; 它似乎工作但它是正确的方法吗?非常感谢丹尼尔! 【参考方案1】:

只是从评论线程中重申,您不应该从其超级视图中删除窗口(它在技术上没有超级视图,因此它可能会导致问题)。 设置窗口的rootViewController 属性应该换出视图层次结构, 显然,抖动来自更改窗口的rootViewController 属性,所以也许解决方案是避免使用该属性。以下是我认为应该足以完成此任务的内容:

-(void)flipToHelp 
     HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
     [UIView beginAnimations:@"flipview" context:nil]; 
     [UIView setAnimationDuration:0.5];
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:_window cache:YES];
    [self.tabBarController removeFromSuperview];
    [_window addSubview:helpVariable];
    [UIView commitAnimations];

【讨论】:

这里不要乱搞-(void)flipToHelp HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil]; [self setHelpViewController:helpVariable]; [UIView beginAnimations:@"flipview" context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_window cache:YES]; [helpVariable release]; [self.window addSubview:self.HelpViewController.view]; [UIView commitAnimations]; 当您设置rootViewController 时,可能是UIWindow 如何更新视图的问题。也许你最好的选择是根本不使用该属性——我会用你的解决方案更新答案。【参考方案2】:
-(void)flipToHelp 
  HelpViewController *helpVariable = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
  [self setHelpViewController:helpVariable];
  [helpVariable release];

  [UIView beginAnimations:@"flipview" context:nil]; 
  [UIView setAnimationDuration:0.5];
  [UIView setAnimationCurve:UIViewAnimationCurveLinear];
  [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
                         forView:self.window
                           cache:YES];

  self.window.rootViewController = self.HelpViewController;
  [UIView commitAnimations];

这段代码怎么样?它还有生涩的动画吗?

【讨论】:

以上是关于为啥我在使用这个 UIView 动画块时会看到生涩的动画?的主要内容,如果未能解决你的问题,请参考以下文章

我的 UIView 动画很生涩 - 如何优化以下代码?

为啥 iOS 动画第一次运行时会变慢?

UIView 动画 swift 4 Xcode9 的问题

为啥UIView动画会改变View frame?

更改滑块时如何更新子类 UIView 以进行绘图?

为啥我的 UIView 在滚动时会在 UIScrollView 内移动?