为啥我在使用这个 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 动画块时会看到生涩的动画?的主要内容,如果未能解决你的问题,请参考以下文章