草庐IT

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

coder 2023-09-25 原文

我找到了通过缩放动画调用 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/

有关ios - pushViewController 带有缩放动画,显示背景的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  5. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

    我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  10. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

随机推荐