UIViewController 包含像 Google+ 这样的动画

2023-12-22

理解我想要解释的内容的最好方法是打开Google+应用程序并点击主帖子流中显示的帖子背景中的任意位置。

当您点击它时,整个帖子会以漂亮的动画自动移动到屏幕中央,并在其下方加载帖子的评论。

我认为这是一个常见的UIViewController遏制场景,其中一个UIViewController在另一个里面。但是帖子如何能够动画地移动它并在容器视图控制器内“转移”自身呢?

我已经尝试创建一个简单的按钮并显示UIViewController作为彼此的弹出窗口,但不知道如何执行 Google+ 应用程序(和其他应用程序)的操作。

UPDATE

这是屏幕截图。

正如您所看到的,当您点击帖子时,帖子会向上滑动并成为新的包含内容UIViewController.


正如已经指出的,有很多方法可以实现此 UI,但一种方法是从 tableview 单元格中获取视图,将其移动到某个新背景上,然后更改其框架。当你把它放回去时,只需颠倒这个过程即可。

更详细一点可能如下:

  1. 在单元格中,我有一个容器视图,它是一个滚动视图(其用户交互通常被禁用)。

  2. 当用户点击它时,

    • 创建一个新的透明背景视图,占据整个屏幕;

    • 为该背景提供一个点击手势识别器,该识别器可以在稍后逆转该过程;

    • 将单元格的容器视图从单元格移动到这个新的背景视图(使用convertRect所以它还没有移动);

    • 通过变换对容器的轻微收缩进行动画处理(一种微妙的效果,为您提供在视图上“下推”的效果);

    • 在该动画的完成块中,启动一个新动画:

      • 恢复身份的转变;

      • 将背景色设置为很大程度上不透明(但不完全如此)的颜色;

      • 对容器视图的大小进行动画处理以占据更多屏​​幕

      • 继续并在该容器视图上启用用户交互,以便您可以滚动;

  3. 在我们的背景上设置一个点击手势的处理程序来逆转该过程。

Thus:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    PostCell *cell = (id)[tableView cellForRowAtIndexPath:indexPath];

    // create subview to obscure the table view behind us

    UIView *backdropView = [[UIView alloc] initWithFrame:self.view.bounds];
    backdropView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:backdropView];
    self.backdropView = backdropView;

    // add a tap gesture so we can reverse the process

    [backdropView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                              action:@selector(handleTapGesture:)]];

    // move the cell's container view to the backdrop view, preserving its location on the screen
    // (so it doesn't look like it moved)

    self.viewToMove = cell.containerView;
    self.viewToMoveOriginalCell = cell;
    self.viewToMoveOriginalFrame = cell.containerView.frame;

    // figure out where this goes on the backdrop

    CGRect frame = [self.viewToMoveOriginalCell convertRect:self.viewToMoveOriginalFrame
                                                     toView:self.backdropView];

    // move it there (though it won't appear to move yet, we're just changing its superview)

    [self.backdropView addSubview:self.viewToMove];
    self.viewToMove.frame = frame;

    // now do the animation

    [UIView animateWithDuration:0.25
                          delay:0.0
                        options:0.0
                     animations:^{

                         // first shrinking it a bit

                         self.viewToMove.transform = CGAffineTransformMakeScale(0.95, 0.95);
                     }
                     completion:^(BOOL finished) {

                         // finally restoring the size and making it bigger
                         // (and reveal the backdrop that obscures the tableview)

                         [UIView animateWithDuration:0.5 animations:^{
                             CGFloat horizontalMargin = (self.view.bounds.size.width - frame.size.width) / 2.0;
                             backdropView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
                             self.viewToMove.transform = CGAffineTransformIdentity;
                             self.viewToMove.frame = CGRectMake(horizontalMargin, kVerticalMargin, self.view.bounds.size.width - 2.0 * horizontalMargin, self.view.bounds.size.height - 2.0 * kVerticalMargin);
                         }];

                         self.viewToMove.userInteractionEnabled = YES;
                     }];
}

- (void)handleTapGesture:(UITapGestureRecognizer *)gesture
{
    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:0
                     animations:^{

                         // in case user scrolled in content view, scroll back

                         [self.viewToMove setContentOffset:CGPointZero animated:YES];

                         // figure out where to resize view on container view so it's
                         // going to end up where it will end up in the cell

                         CGRect frame = [self.viewToMoveOriginalCell convertRect:self.viewToMoveOriginalFrame
                                                                          toView:self.backdropView];
                         self.viewToMove.frame = frame;

                         // make the back drop appear to gracefully disappear

                         self.backdropView.backgroundColor = [UIColor clearColor];

                         // shrink content view a tad in the process

                         self.viewToMove.transform = CGAffineTransformMakeScale(0.95, 0.95);
                     }
                     completion:^(BOOL finished) {

                         // when done with that animation ...

                         [UIView animateWithDuration:0.25
                                               delay:0.0
                                             options:0
                                          animations:^{

                                              // restore the size of the content view

                                              self.viewToMove.transform = CGAffineTransformIdentity;
                                          }
                                          completion:^(BOOL finished) {

                                              // when all done, put the content view back
                                              // in the cell

                                              [self.viewToMoveOriginalCell addSubview:self.viewToMove];
                                              self.viewToMove.frame = self.viewToMoveOriginalFrame;

                                              // turn off its user interaction again 

                                              self.viewToMove.userInteractionEnabled = NO;

                                              // and now safely discard the backdrop

                                              [self.backdropView removeFromSuperview];
                                          }];
                    }];
}

正如您所知,这都是标准表视图等。如果您想使用视图控制器包含(例如,如果视图有大量的用户交互),您也可以这样做。它不会影响单元容器视图的增长/收缩方面的用户体验。

此外,这一切都不是自动布局的。您可以使用自动布局来做到这一点,但恕我直言,这更麻烦,因为您可能必须删除和添加约束,但肯定可以做到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIViewController 包含像 Google+ 这样的动画 的相关文章

  • 是否可以?相机 API ios [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在应用程序中实现一项功能 当用户
  • 在 Alamofire 中快速发送 GET 请求中的 json 对象

    我正在尝试执行一个绑定了 json 对象的 GET 请求 这就是我生成 JSON 对象的方式 let jsonObject String AnyObject ean code type match value 16743799 然后我执行了
  • 为 iPhone 创建 .ipa

    我为 iPhone 开发了一款应用程序 构建后 我在构建文件夹中得到了 app 文件 我的应用程序名称是Myapp 然后我在build文件夹中得到了Myapp app文件 我的问题是我想创建 ipa 文件 这是怎么回事 它是为了安装 越狱的
  • iOS 新手。预期的表达错误?

    这看起来很不寻常 因为该方法与我的 showAnswer 方法完全相同 所以我想我应该在这里问 import QuizViewController h interface QuizViewController end implementat
  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 当点击 UITableViewCell 的子视图时引发选择事件 (didSelectRowAtIndexPath)

    我创建了一个自定义 UITableViewCell 其中包含许多子视图 在大多数情况下 我希望 UITableViewCell 的控制器来处理事件 在一种情况下 我希望子视图简单地将事件传递给父 UITableViewCell 这将导致它在
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 相机叠加图片

    edit 3 好消息和坏消息 好消息是 在连接检查器中 通过断开覆盖 UIToolbar 并连接 UIImageview 我看到theKing 但是 坏消息 我没有看到我也需要的 UIToolbar 所以现在的问题是 当用户完成这里操作后
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 使用 iOS 设备作为 TCP 客户端 - 无 Bonjour

    我想使用 iOS 设备作为 TCP 客户端 但我找不到可理解的 API 指南 示例来说明如何做到这一点 我试过SimpleNetworkStreams and PictureSharing 但他们都使用 Bonjour 我可以轻松建立 UD
  • 多点触摸检测和区分 - Cocos2d for iPhone

    我想知道如何在多点触摸视图中检测和区分触摸 我读过有关 哈希 代码的内容 但我不明白如何使用它 我想知道我的两个精灵何时被同时触摸 就像在钢琴的两个琴键上按下和弦一样 编辑 以下是我的 TouchesBegan 的示例 void ccTou
  • 使用导航控制器在 Storyboard 中呈现视图控制器 - Swift

    我目前在下面的新故事板中显示了一个 viewController var storyboard UIStoryboard UIStoryboard name AccountStoryboard bundle nil var vc Welco
  • iPhone / iPad IOS 应用程序仪器内存计数与 task_info 内存计数

    我一直在使用 Instruments Leak Tester 它给出了大约 1 3 meg 的应用程序总分配数字 但是 当使用 task info 时 它会报告更大的内存量 例如 10 20 meg 我想我只是想确认task info正在返
  • Facebook 登录 Apple CNA

    问题 是否可以设置 Facebook 登录以在 CNA 中使用 是否为开发人员提供 CNA 文档 您可以使用任何开发人员工具调试 CNA 屏幕吗 Details 我创建了一个使用电子邮件提交表单或 Facebook 登录按钮的强制门户登录页
  • 为什么 iOS 5.0 不喜欢纯窗口应用程序?为什么它要求使用视图控制器?

    我有一个使用 Xcode 4 0 的 基于窗口的应用程序 模板创建的 iOS 应用程序 当时运行良好 并且使用的是 iOS 4 3 SDK 这是一个简单地将按钮 标签等直接放置到窗口上的应用程序 没有视图控制器 什么都没有 但现在我已经升级
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • 将 Facebook 图片 URL 上传到 Firebase 存储

    我正在尝试将用户的 Facebook 个人资料图片上传到 Firebase 存储 let dictionary result as NSDictionary let data dictionary objectForKey data let
  • 在应用程序内启用或禁用 Iphone 推送通知

    我有一个 iPhone 应用程序 可以接收推送通知 目前 我可以通过转到 iPhone 设置 通知来禁用我的应用程序的推送通知 但我想在我的应用程序中添加一个开关或按钮来启用或禁用推送通知 这是可以做到的 因为我在 foursquare i

随机推荐

  • C++ 根据模板参数值更改成员函数定义

    是否可以根据模板参数的值有条件地编译函数中的语句 例如 template
  • 如何通过 Javascript 动态创建表单

    我的网站 Aweber 注册表收到大量垃圾邮件 我被告知要在页面呈现后通过 JavaScript 或通过单击按钮动态创建表单 我如何通过 javascript 创建和呈现表单 一些事情如下 在 body 标签之后添加此内容 这是一个粗略的草
  • Azure Devops 管道 yml 在各个阶段循环

    我如何循环遍历数组或对象来创建阶段 下面是一个有效的 yml 文件 您可以看到构建阶段在作业的参数环境上循环 在发布阶段是否有可能实现同样的目标 发布阶段需要手动批准 必须按顺序运行并且只有在前一阶段成功完成后才能运行 parameters
  • Camera.set 预览{@override onPreviewFrame() } 不起作用

    我想要录制视频并分析当前位图在服务中 所以我注册surfaceHolder addCallback in onStartCommand功能 And set mCamera setPreviewCallback in surfaceCreat
  • ListView 抖动中的问题开关值

    我在 ListView 中为每个元素创建一个 Switch 小部件 当我单击开关时 所有元素的值都会更改 我检查了 flutter 文档 dart 文档 我想 我没有恢复 onChanged 方法中的元素位置 但怎么办呢 当我单击时 我的值
  • 带有 URL 编码数据的 Spring RestTemplate POST 请求

    我是 Spring 新手 正在尝试使用 RestTemplate 执行休息请求 Java 代码应执行与以下curl 命令相同的操作 curl data name feature color 5843AD header PRIVATE TOK
  • android中每个列表项都有viewpager的listview

    在将数据设置为列表视图中的列表项时 我需要您的帮助 在我的列表视图中 每个项目都有一个 ViewPager 每个 viewpager 应该有不同的数据 我不知道如何为每个视图页面设置不同的数据 实际上 基于列表项索引 我需要设置数据视图页面
  • 使用ip route add为多台设备添加组播路由

    TLDR 有没有办法使用 ip Route 为多个网卡添加多播路由 我们有软件将两个绑定到不同 NICS 上不同 IP 地址的套接字连接到两个单独的多播组 例如套接字 1 绑定到 192 168 0 2 并加入多播组 233 255 10
  • 当没有输出时 Process.StandardOutput.Readline() 挂起

    Note 我正在尝试跑步packer exe作为解决特定问题的后台进程azure arm构建器 我需要观察输出 我没有使用Start Process因为我不想使用中间文件来使用输出 我设置了以下代码packer exe在后台运行 以便我可以
  • 白色背景上带有浮动标签的 TextInputLayout Android 中的可见性问题

    我正在创建具有 textinputlayout 浮动标签的简单登录屏幕 下面给出了 java 文件和 xml protected void onCreate Bundle savedInstanceState super onCreate
  • Control.ClientRectangle 与 Control.DisplayRectangle

    我了解有关表单 控件的客户端矩形的概念 但我不明白之间有什么区别 Control ClientRectangle and Control DisplayRectangle 在阅读了这两个属性的 MSDN 页面后 并不清楚其中一个何时会返回与
  • 为什么我们需要 Hadoop 无密码 ssh?

    AFAIK 需要无密码 ssh 以便主节点可以在每个从节点上启动守护进程 除此之外 无密码ssh对于Hadoop的操作有什么用处吗 用户代码 jar 和数据块如何跨从节点传输 我想知道所使用的机制和协议 无密码 SSH 应该只配置为主从对
  • 在 PHP 中如何检查数组中的所有键是否都有空值? [复制]

    这个问题在这里已经有答案了 我有一个数组 array array key1 gt null key2 gt null key3 gt null key4 gt null 我想确定是否所有数组键都有空值 如果是 则返回 false 上面的示例
  • Swift 4:将字典添加到 Plist

    所以 我有一个空的 plist 我试图在 plist 中创建这些值 使用此代码 let dictionary String String key1 value1 key2 value2 key3 value3 let documentDir
  • 将 iOS 键盘布局更改为表情符号?

    当 UITextField 成为第一响应者时 是否可以将键盘布局更改为表情符号 或根据用户操作 例如点击 UIButton 我知道我可以将键盘布局更改为以下之一 typedef enum UIKeyboardTypeDefault Defa
  • 我应该使用 OpenId 的哪个 Erlang 实现(如果有)?

    我需要 OpenId 协议的 Erlang 实现 我发现了以下内容 但这似乎是一个处于早期阶段的项目 http code google com p erlopenid http code google com p erlopenid 关于我
  • python 中的 next() 真的那么快吗?

    通过这里的一篇文章 我读到使用 next 搜索和检索列表中元素的第一次出现可能会很快 然而 我惊讶地发现传统的 for if break 语法在相当长一段时间内表现得更好 如果我的分析有错误 请纠正我 这是我尝试过的一个片段 gt gt g
  • 错误:HTTP 错误:400,项目“my_project”不是启用 Firestore 的项目

    当我运行命令时firebase deploy我收到此错误 错误 HTTP 错误 400 项目 my project 不是启用 Firestore 的项目 您是否正在尝试使用 Cloud Firestore 如果是这样 请访问控制台的数据库部
  • 我们如何在 ionic 应用程序中隐藏启动屏幕?

    无论如何 在离子应用程序中隐藏或不显示启动屏幕 并且电容器中的启动屏幕时间较少或在科尔多瓦中较少 以及如何减少离子应用程序中的启动屏幕时间 谢谢 这是禁用启动画面的调整 在 config xml 文件中
  • UIViewController 包含像 Google+ 这样的动画

    理解我想要解释的内容的最好方法是打开Google 应用程序并点击主帖子流中显示的帖子背景中的任意位置 当您点击它时 整个帖子会以漂亮的动画自动移动到屏幕中央 并在其下方加载帖子的评论 我认为这是一个常见的UIViewController遏制