gpt4 book ai didi

ios - pushViewController 带有缩放动画,显示背景

转载 作者:可可西里 更新时间:2023-11-01 04:40:35 24 4
gpt4 key购买 nike

我找到了通过缩放动画调用 pushViewController 的方法,
像 facebook iPhone 应用程序主菜单图标点击动画。
(新的 viewController 从中心弹出,并缩放到原始大小。)

我搜索了几种改变 pushViewController 动画的方法。

首先,我试过这个:

viewController.view.transform = CGAffineTransformMakeScale(0.5f, 0.5f);
[UIView animateWithDuration:0.5f animations:^{
viewController.view.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
}];
[self.navigationController pushViewController:viewController animated:NO];

但有问题,
动画开始时旧的 viewController 消失了,只有白色背景。

如果我使用 CATransition 来改变动画,
我可以同时显示旧的和新的 viewController,
但没有缩放动画,只有移动、插入、淡入动画。

我想同时显示新旧 View Controller ,如 CATransition 动画,
并且需要实现我的自定义动画的方法。

这是我的最后一个建议,肮脏的方式:
[self.view addSubview:viewController.view];
viewController.view.transform = CGAffineTransformMakeScale(0.5f, 0.5f);
[UIView animateWithDuration:0.5f
delay:0.0f
options:UIViewAnimationCurveEaseInOut
animations:^{
viewController.view.alpha = 1.0f;
viewController.view.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} completion:^(BOOL finished) {
[self.navigationController pushViewController:viewController animated:NO];
[viewController release];
}];

首先,我添加了新的 viewController.view 作为 subview ,我可以用新旧 View 显示动画。
当动画结束时,pushViewController 稍后。

这样我就可以实现我的想法,
但我认为这是肮脏的方式,仍然存在问题:

导航栏项目不会立即更改,而是在动画结束后更改。

有没有简单明了的方法来实现这个动画?
我认为在不改变 pushViewController 的原始实现的情况下不可能做到这一点,我应该对 pushViewController 进行子类化吗?

感谢阅读,感谢您的帮助。

最佳答案

在回答最初的问题时,我不确定您是否认为这是一种改进,但我认为您可以将导航栏包含在正在转换的 View 中(a)在 IB 中,将导航栏添加到您的 View 被转换到,(b) 在开始动画之前对根导航 Controller 的导航栏的隐藏进行动画处理(因此它会随着新 View 滑入而滑落),以及 (c) 在动画的完成块中,隐藏您的新 View 添加了导航栏并取消隐藏根导航 Controller 的导航栏。也许这会使某些东西更接近您的意图,尽管可能与您最初设想的不同。不过,它并不完美。代码可能类似于:

MyViewController *newController = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil];
newController.view.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.view addSubview:newController.view];

[UIView animateWithDuration:0.5f
delay:0.0f
options:UIViewAnimationCurveEaseInOut
animations:^{
newController.view.alpha = 1.0f;
newController.view.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} completion:^(BOOL finished) {
[newController.view removeFromSuperview];
[self.navigationController pushViewController:newController animated:NO];
[newController.tempBar setHidden:YES];
[self.navigationController setNavigationBarHidden:NO animated:NO];
}];

它为您的“肮脏方式”添加了更多“污垢”,但它可能会呈现您正在寻找的效果。您只是想让新 View 中的临时导航栏看起来与最终的根导航 Controller 的导航栏看起来一样,而用户不应该更聪明。如果这仍然不能完全达到您的要求,您可以完全隐藏根导航 Controller 的栏,并始终将导航放在您的 View 上,在这种情况下,当您过渡到您的 View 时,效果将完全无缝新观点。

或者,您可以保留现有代码并在转换之前设置当前 View 的标题,这样看起来标题更改可能是预先发生的。但是,您可能需要在返回时重置它,设置后退按钮等,因此可能不值得。

顺便说一句,这与最初的问题有点无关(所以我提前道歉),但是为了回应另一个建议,即您不应该为 View Controller 设置动画,而应该只为 View 设置动画,我想说谨慎的话。是的,从技术上讲是对的,但我很担心这是否会鼓励人们通过 (a) 创建新的 View Controller 来采用添加新 View 的不良做法; (b) 将该 View Controller 的 View 添加为当前 View 的 subview 的动画;但是 (c) 不对那个新的 View Controller 做任何事情来将它添加到您的 View Controller 层次结构中(例如 pushViewController 或 presentViewController)。

如果这是另一个答案的意图,我不得不说我认为这是一个非常糟糕的主意。 (如果这不是我们想要的,那么我很抱歉,但我认为人们很容易误解这个建议。)最重要的是,我最近看到人们做这样的事情:
MyViewController *newController = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil];

// do some animation around adding the new view as a subview of your current view
// but neglect to ever invoke pushViewController or presentViewController

[self.view addSubview:newController.view];

不推荐这样做有几个原因。首先,如果它是一个 ARC 项目,当 newController 超出范围时,您的 View Controller 将被丢弃。 (由于人们过渡到 ARC 时抛出异常,因此在 SO 上发布了大量此类问题。)当然,您可以通过将 newController 设为主 Controller 的 ivar 来解决此问题,这样它就不会失败范围,但要小心记住在主 Controller 最终被释放或删除 subview 时将其设置为 nil,否则可能会泄漏。而且如果你在一个非ARC项目中,就更容易泄漏,所以一定要在删除 subview 时释放 View Controller ,以防止泄漏。

其次,可能更重要的是,虽然上面的代码似乎可以工作(或者至少如果您将 Controller 设为 ivar),但最终您的 View Controller 的层次结构与 View 的层次结构之间存在脱节。 (在 session 102 of WWDC 2011 关于一个不同的主题, View Controller 包含,它包括一个冗长但相关的关于保持 View Controller 层次结构和 View 层次结构协调的重要性的讨论,例如,旋转事件可能无法正确发送到新 View 的 Controller ,因为 Controller 不在 Controller 层次结构中,因此 iOS 不知道将它们发送到您的 Controller 。)底线,如果您使用另一个 View Controller 的 View 添加为当前 View 的 subview ,它很脆弱,容易受到影响打破 iOS 升级,旋转事件之类的东西不会正确传递到新 View 的 View Controller 。如果您这样做,至少要意识到这不是好的做法,并自行评估是否要这样做。没有必要绕过正确的 View Controller 层次结构,我个人想劝阻倾向于这样做的人。

最重要的是,如果您要转换到不同 View Controller 的 View ,您真的想坚持使用 pushViewController 或presentViewController,并围绕新 Controller 的 View 制作动画(通常它远没有这个动画那么复杂......通常它非常简单,我已经更轻松地完成了各种淡入淡出和翻转动画......正是使用变换使这变得复杂)。

或者,如果您想为新的 UIView subview 设置动画并且根本不处理 View Controller ,只需确保它不是另一个 View Controller 的 View ,而是例如您以编程方式创建的 View ,该 View 使用与原始 View Controller 相同的 View Controller 看法。而且,如果您决定使用另一个 View Controller 的 View 作为现有 Controller 的 subview ,只需知道它有点脆弱,并且某些事件可能不会像您期望的那样传输到您的新 View Controller ,并且可能不会像您可能想要的“ future 证明”。

关于ios - pushViewController 带有缩放动画,显示背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5833970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com