使用自动布局时如何制作从一个 UIView 到另一个 UIView 的翻转动画?

2024-03-07

我总是使用以下代码在一个视图和另一个视图之间制作翻转动画:

        [UIView transitionFromView:firstView
                        toView:secondView
                      duration:0.6
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished) {
                        // finish code here
                    }];

这个效果很好,翻转效果看起来很自然。

但是当我在故事板定义的视图上使用它时自动布局事情开始变得混乱 - 在此动画之后,视图被调整大小并移动。

有什么办法可以animate这种通过动画约束的翻转?


自动布局只能用于定位视图和调整视图大小。它不能用于产生产生翻转过渡效果所需的那种核心动画变换。所以简短的确切答案是否定的,没有办法通过动画约束来动画这种翻转。

使用显示/隐藏过渡选项

但是,有一种简单的方法可以修改您已经使用的代码,使其与自动布局保持一致。这样做的方法是(1)添加你的firstView and secondView到你的视图层次结构before您订购动画,(2) 确保您已添加定义这两个视图布局的自动布局约束,以及 (3) 向动画添加一个选项,以便仅显示/隐藏这两个视图,而不是拆除并设置新的视图层次结构。

换句话说,你想要类似的东西:

        // assert: secondView added to view hierarchy
        // assert: secondView.hidden == true
        // assert: secondView has correct constraints
        [UIView transitionFromView:firstView
                            toView:secondView
                           duration:0.6
                            options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionShowHideTransitionViews
                         completion:nil];

为什么需要这个?原因是,如果没有UIViewAnimationOptionShowHideTransitionViews选项、方法transitionFromView:toView:duration:options:completion:将实际操作视图层次结构并添加新的目标视图。如果启用自动布局,则不会正确布局,因为它没有约束。

您可以在此处查看展示此方法的示例项目:https://github.com/algal/AutoLayoutFlipDemo https://github.com/algal/AutoLayoutFlipDemo

使用视图层次结构操作

或者,您也可以使用现有的呼叫transitionFromView:toView:duration:options:completion:。但是,如果您不打算只显示已经有约束的目标视图,那么您需要使用完成块来添加这些约束,如下所示:

    [UIView transitionFromView:firstView
                        toView:secondView
                       duration:0.6
                        options:UIViewAnimationOptionTransitionFlipFromLeft
                     completion:^(BOOL finished) {
 [self.view addConstraint:[NSLayoutConstraint                               
  constraintWithItem:secondView
  attribute:NSLayoutAttributeCenterX
  relatedBy:NSLayoutRelationEqual
  toItem:self.view
  attribute:NSLayoutAttributeCenterX
  multiplier:1 constant:0]];

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:secondView
  attribute:NSLayoutAttributeCenterY
  relatedBy:NSLayoutRelationEqual
  toItem:self.view
  attribute:NSLayoutAttributeCenterY
  multiplier:1 constant:0]];
                }];

这种方法的一个工作示例如下:https://github.com/algal/AutoLayoutFlipDemo2 https://github.com/algal/AutoLayoutFlipDemo2

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

使用自动布局时如何制作从一个 UIView 到另一个 UIView 的翻转动画? 的相关文章

随机推荐

  • Python - Sympy 最小值和最大值

    我正在尝试学习 sympy 的微积分函数 并且我能够通过以下方式尽可能获得极值临界点的二阶导数的根 import numpy as np from numpy import linspace math arange linspace fro
  • MVVM、ObservableCollection、异步等

    因此 我正在进入下一阶段的教育 并且已经遇到了与 SQLite 使用相关的一些障碍 这是一个通用应用程序 我当前的重点是该解决方案的 Windows Phone 方面 我的问题在某种程度上独立于 SQLite 但我将使用它作为示例 我正在将
  • 如何展示在线用户

    我正在编写一个简单的聊天 我需要列出在线用户 我不使用devise对于身份验证 有一个自定义user通过验证的模型omniauth user rb class User lt ActiveRecord Base has many messa
  • 验证 Facebook Connect 会话

    我正在编写一个应用程序 它有多个前端客户端 使用 Facebook Connect 作为单点登录解决方案 例如 其中一个客户端在 iOS 平台上运行 因此所有 Facebook 身份验证都通过 iOS Facebook SDK 在客户端上进
  • MySql - 计算多行的时间差

    我有一个包含制造装配数据的表 包括时间戳 我试图确定 作业 开始之间的平均间隔 以分钟为单位 我返回 id 和时间的查询如下所示 select job id job started from JobTable where job start
  • chrome 扩展 - 我如何等待 chrome.runtime 函数?

    我在后台的操作是访问该站点并从那里获取信息 问题是代码在收到信息之前继续运行 附上显示问题的代码 背景 js chrome runtime onMessage addListener function request sender send
  • 将警告视为 TFS 级别 VS2017 上的错误

    我已经为此苦苦挣扎了一段时间 我搜索并尝试了不同的方法 但它不起作用 所以我将其发布在这里 我想在 TFS 级别构建时将警告视为错误 但此选项不起作用 我已经按照其他帖子上的建议完成了 我已经尝试过 p TreatWarningsAsErr
  • 如何使用 Excel VBA 将项目添加到 Sharepoint 列表?

    我有一个基于 Excel 的应用程序 它收集一些用户输入 并根据该用户输入进行一些计算 应用程序本身不存储任何用户输入或计算 目前 每当用户运行该应用程序时 它都会将数据发送到 Access 数据库并向 Access 表中插入一行xlTab
  • 每行读取行的最快方法是什么

    我有一个巨大的字符串文件 所有行都应添加到我的代码中的列表中 最快的方法是什么 我发现this https stackoverflow com questions 9093888 fastest way of reading relativ
  • C++ 流混淆:istreambuf_iterator 与 istream_iterator?

    有什么区别istreambuf iterator and istream iterator 一般来说 流和streambufs之间有什么区别 我真的找不到任何明确的解释 所以决定在这里询问 IOstreams 使用streambufs 作为
  • 使用 SQL 从 XML 中删除具有特定值的节点

    我正在尝试解析一段 XML 并删除包含某些值的节点 如果值准确 我知道如何删除它们 但我想使用 包含 之类的东西 这可以准确删除 update XML set data modify delete Message text customer
  • 如何返回异步 IEnumerable

    我有以下方法 public async IEnumerable
  • 如果java spring cors策略被阻止,如何访问后端? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我使用 Java spring 作为后端 当前端到达我的端点时 他会收到错误 从源 http localhost 300
  • 如何扁平化查询结果?

    用一个例子让大家很容易理解 https developer github com v4 explorer https developer github com v4 explorer 查询观众信息 query viewer follower
  • 材质 UI 选择设置值始终超出范围

    我有一个 MaterialUI Select 代码 并且我正在动态处理 value 参数 我的问题是 当我设置任何值时 它总是说它超出范围 甚至在有效值中显示该值 SelectInput js 291 Material UI you hav
  • 投放到某个事件(而不是日历) - 如何识别事件?

    我已经成功实现了将 jquery ui 元素拖动到我的 fullCalendar 上 问题是 我想要放置的不是日历本身 而是日历上显示的特定事件 以便将放置的项目添加到该事件中 缺少的部分是如何识别当我放下鼠标时发生的事件 drop fun
  • 如何将控制台输出写入文本文件

    我是编程新手 我在网页上搜索了这个问题的答案 并尝试了很多可能性 但没有成功 我目前已成功将电位计连接到我的树莓派并在控制台上获取值 但我不知道如何将这些值保存到文本文件中 这是我的代码 usr bin python import spid
  • 在 makefile 中设置环境变量

    我有一个像这样的 makefile setup setenv var1 var1 setenv var2 var2 task1 setup source task1 csh task2 setup source task2 csh 我使用以
  • 在 Postgres 中查询失败但在 H2 中工作(Postgres 模式)

    我经常发现自己想要为数据库查询编写自动化测试 我当前的用例是 Spring MVC Web 应用程序和 Postgres 数据库 据我所知 我有两个选择 建立一个实际的 Postgres 实例并使用测试数据集对其进行初始化 利用内存数据库
  • 使用自动布局时如何制作从一个 UIView 到另一个 UIView 的翻转动画?

    我总是使用以下代码在一个视图和另一个视图之间制作翻转动画 UIView transitionFromView firstView toView secondView duration 0 6 options UIViewAnimationO