如何使用 UIViewPropertyAnimator 进行自动布局?

2024-01-10

我可以在网上找到的所有示例UIViewPropertyAnimator使用通过设置框架布局的视图,而不是使用自动布局,这是视图通常的布局方式。使用自动布局时,视图会动画到我想要的位置,但之后我不确定如何将其设置回其“模型”位置。

// Move a view that is constrained to the center of its superview
UIViewPropertyAnimator(duration: 1, curve: .linear) {
    testView.center = CGPoint(x: 10, y: 10)
}.startAnimation()

这显然增加了某种限制?我在执行动画之前和之后记录了容器视图的约束:

CONSTRAINTS BEFORE:
view: [<NSLayoutConstraint:0x618000094f00 UIView:0x7fd764004050.centerX == UIView:0x7fd75fd00000.centerX   (active)>, <NSLayoutConstraint:0x618000092de0 UIView:0x7fd764004050.centerY == UIView:0x7fd75fd00000.centerY   (active)>]

CONSTRAINTS AFTER:
view: [<NSLayoutConstraint:0x618000094f00 UIView:0x7fd764004050.centerX == UIView:0x7fd75fd00000.centerX   (active)>, <NSLayoutConstraint:0x618000092de0 UIView:0x7fd764004050.centerY == UIView:0x7fd75fd00000.centerY   (active)>, <NSLayoutConstraint:0x6100000922a0 'UIView-Encapsulated-Layout-Height' UIView:0x7fd75fd00000.height == 667   (active)>, <NSAutoresizingMaskLayoutConstraint:0x610000092570 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' UIView:0x7fd75fd00000.minX == 0   (active, names: '|':UIWindow:0x7fd75fc07110 )>, <NSAutoresizingMaskLayoutConstraint:0x610000092890 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' UIView:0x7fd75fd00000.minY == 0   (active, names: '|':UIWindow:0x7fd75fc07110 )>, <NSLayoutConstraint:0x610000091670 'UIView-Encapsulated-Layout-Width' UIView:0x7fd75fd00000.width == 375   (active)>]

这里发生了什么?我应该如何处理使用自动布局定位的视图的动画?苹果是否鼓励用户回归基于框架的布局?


您可以使用UIViewPropertyAnimator with 自动布局,但是您需要修改约束而不是视图的框架并调用layoutIfNeeded()封闭物内部。

第一个示例:通过修改约束来制作动画constant

在 Storyboard 中创建一个视图。创建约束来定位centerX您的视图的边缘等于超级视图的前沿。创建一个@IBOutlet到那个约束并称之为centerXConstraint。同样,创建一个centerYConstraint这定位了centerY您的视图的顶部等于其超级视图的顶部。这两个约束都应该有constant = 0.

Create @IBOutlets 到约束:

@IBOutlet weak var centerXConstraint: NSLayoutConstraint!
@IBOutlet weak var centerYConstraint: NSLayoutConstraint!

Set the constant将约束值更改为新位置,然后调用view.layoutIfNeeded()代替UIViewPropertyAnimator:

// Make sure view has been laid out
view.layoutIfNeeded()

// Set new X and Y locations for the view
centerXConstraint.constant = 50
centerYConstraint.constant = 80

UIViewPropertyAnimator(duration: 1, curve: .easeInOut) {            
    self.view.layoutIfNeeded()
}.startAnimation()

第二个示例:通过激活新约束来制作动画

在 Storyboard 中创建一个视图(例如redView)并创建一个@IBOutlet在你的代码中:

@IBOutlet weak var redView: UIView!

Create @IBOutlet控制视图位置的约束

// Outlets to the constraints set in the Storyboard
@IBOutlet weak var topConstraint: NSLayoutConstraint!
@IBOutlet weak var leadingConstraint: NSLayoutConstraint!

然后当需要制作动画时:

// Make sure view has been laid out
view.layoutIfNeeded()

// Deactivate the old constraints
topConstraint.isActive = false
leadingConstraint.isActive = false

// Active new constraints that move view to the bottom right        
redView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
redView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

// Animate the change        
UIViewPropertyAnimator(duration: 1, curve: .easeInOut) {
    self.view.layoutIfNeeded()
}.startAnimation()

那么这比旧的更好吗?UIView动画块?

UIViewPropertyAnimator是一个可以配置为以各种方式控制动画的对象。这是一个完整的示例,演示了:

  1. 开始动画
  2. 暂停动画
  3. 找出已完成的动画部分并将幻灯片值设置为该部分
  4. 使用滑块拖动动画
class ViewController: UIViewController {

    @IBOutlet weak var redView: UIView!
    @IBOutlet weak var centerXConstraint: NSLayoutConstraint!
    @IBOutlet weak var centerYConstraint: NSLayoutConstraint!
    @IBOutlet weak var slider: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()

        slider.isHidden = true
    }

    var myAnimator: UIViewPropertyAnimator?

    @IBAction func startAnimation(_ sender: UIButton) {
        view.layoutIfNeeded()

        centerXConstraint.isActive = false
        centerYConstraint.isActive = false

        redView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

        redView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        myAnimator = UIViewPropertyAnimator(duration: 10, curve: .easeInOut) {

            self.view.layoutIfNeeded()
        }

        myAnimator?.startAnimation()
    }

    @IBAction func pauseAnimation(_ sender: UIButton) {
        guard let myAnimator = myAnimator else { return }

        myAnimator.pauseAnimation()

        print("The animation is \(String(format: "%.1f", myAnimator.fractionComplete * 100))% complete")

        slider.value = Float(myAnimator.fractionComplete)
        slider.isHidden = false
    }

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

如何使用 UIViewPropertyAnimator 进行自动布局? 的相关文章

  • 不确定如何在使用故事板时正确子类化 UIApplication

    我想在 X 次用户不活动 没有触发触摸事件 后返回故事板的初始视图控制器 经过一些研究 我发现检测不活动的最常见方法是触发 NSTimer 并在事件触发时重置间隔 为了检测触发的事件 我们在 UIApplication 的子类中重写 UIA
  • 如何在flutter插件中调试iOS原生代码?

    我想知道如何在插件中调试 flutter iOS 代码 我可以打开每当您创建插件时生成的示例应用程序 但我将插件代码视为二进制框架 因此我无法调试它 对于 android 这相当简单 我只需打开 A S 中的 android 文件夹即可 插
  • 在 OpenGL ES 1.1 中创建闪电

    我需要使用 OpenGL ES 1 1 iPhone 创建漂亮的闪电 并计划使用着色器 然而 当我在上一个问题中询问它时 OpenGL ES 1 x 着色器 https stackoverflow com questions 543948
  • 如何从 iOS 本机共享功能中删除某些选项? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一款 iOS 游戏 想知道如何删除 iOS 在自动共享时提供的一些本机选项 例如 分配给联系人 和 打印 我对此做了很多研究 我
  • UITableView 部分始终保持在视图内

    我有一个包含 3 个部分的 UITableView 第 1 节 该部分的标题是 Players 内容恰好是 1 个单元格 包含 1 4 个玩家姓名的水平列表 第 2 节 该部分的标题是 回合 内容是 X 个单元格 每个单元格包含每个玩家在第
  • iPhone Objective-C 以编程方式将范围按钮添加到 UISearchBar

    我目前这段代码用于创建 UISearchBar 改编自之前的 stackoverflow 示例 UISearchBar searchBar UISearchBar alloc initWithFrame CGRectZero searchB
  • 身份验证后如何退出 Google

    所以我的应用程序可以选择使用 Google 登录 单击 Google 提供的按钮后 将打开一个 Web 视图并让用户输入其凭据 允许应用程序访问其信息后 应用程序将用户登录并将 SignInViewController 更改为 TabBar
  • 带有 HTML 的 UIActivityViewController

    当我将包含 HTML 内容的字符串作为数组元素传递给UIActivityViewController initWithActivityItems方法中 它不会在选定的 共享 控制器中将其呈现为 HTML 而是呈现 HTML 源 即标记而不是
  • 不透明动画在 IE 上不起作用

    我有一个动画菜单 其中包含一些级联不透明动画 这些动画在打开菜单和悬停每个按钮时执行 它只是每 100 毫秒向菜单上的每个图标添加 colorHigh 类 你可以看到一个现场演示在这里 http germanalvarez net 5 la
  • 如何在当前视图上方创建半透明视图层?

    您可能以前见过这种情况 它在 ScoutMob 等消费时尚应用程序中变得非常流行 我正在尝试在启动时实现 60 的透明视图 该视图将覆盖我的主屏幕 解释如何使用主屏幕的功能并在点击时消失 我已经完成了整个应用程序 它从几年前就开始使用 xi
  • 使用 Xcode 资产目录缓存 UIImage

    我们都知道UIImage神秘的幕后缓存机制imageNamed 方法 在苹果的UIImage 类参考 https developer apple com library IOS documentation UIKit Reference U
  • 何时使用 takeUnretainedValue() 或 takeRetainedValue() 来检索 Swift 中的非托管对象?

    根据将 Swift 与 Cocoa 和 Objective C 结合使用 https developer apple com library prerelease ios documentation Swift Conceptual Bui
  • 识别用户是否在 iOS 6 设置中定义了本机 Facebook 帐户

    有没有办法通过 FACEBOOK SDK 3 1 和 iOS 6 知道用户是否在 iPhone 设置中定义了其 Facebook 帐户以供本机 Facebook 使用 我想要做的是 当打开我的应用程序时 如果用户在 iPhone 设置中定义
  • NSXMLParser 解析使用 Windows-1256 编码的 xml 文件

    我想解析 Windows 1256 编码的 rss 文件 但解析器没有读取它 我用 UTF8 编码做了很多解析 但只有这个不起作用 为什么 带有 Windows 1256 的 rss 文件 http youm7 com Rss asp 解决
  • SwiftUI 中的计算 (NSObject) 属性不会更新视图

    所以 我想要一个Text它根据我的 CoreData 模型的内容更改其内容 为此 我在 Xcode beta 4 中使用了计算属性 但它似乎不再起作用了 这是一个错误还是还有其他我没有看到的问题 我真正遇到的问题是我的视图 和计算的属性 似
  • iOS Javascript 引擎 parseFloat(1) 返回负数

    这段代码将使错误出现 function causeBug d var k var n parseFloat 1 var c Math abs d if n lt 0 k else k return k n function for var
  • 在 IBAction 中调用其他函数之前,如何使函数完成?

    我无法理解完成处理程序 我有一个 textFieldEditingDidChange IBAction 首先调用verify 文本字段输入上的函数然后是 if 语句在 apply 返回的布尔值上 问题是 if 语句在 verify 完成之前
  • 归档时出现“没有此类模块”错误

    我的 Swift 4 应用程序在所有模拟器上重建并成功运行 除了Generic iOS Device 如果我尝试将其存档或重建Generic iOS Device 我得到一个No such module与我的 Pod 框架之一相关的错误 我
  • 如何在 Swift 中的标签上制作阴影效果?

    我不知道如何在标签上编写阴影代码 我有一个会改变的乐谱标签 因此无法仅对带有阴影的文本进行Photoshop处理 我需要对其进行编码 以便它始终自动在文本后面有一个模糊的阴影 有人可以举一些例子或提供帮助吗 人们说这是重复的 重复 是关于
  • iOS:如何实现像Android的startActivityForResult这样的行为

    我是一名 Android 开发人员 正在开发我们应用程序的 iOS 版本 我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为 我需要显示一个新的视图控制器 然后在新的视图控制器关闭时将控制权

随机推荐

  • 如何使用 OpenCV 在 COD 中搜索玩家模型

    我正在尝试创建一个程序 可以在 使命召唤 游戏视频中找到人物 我从该视频中编制了约 2200 张单独图像的列表 其中包含或不包含人物图像 然后我尝试训练神经网络来区分两组图像之间的差异 然后 我将每个视频帧分成几百个网格矩形 并用人工神经网
  • 在 Mac OS Lion 上使用 XAMPP 安装 MongoDb PHP 驱动程序时出错

    当我尝试运行以下命令时出现此错误 须藤 pecl 安装 mongo Error php mongo c 22 10 fatal error php h file not found include
  • #ifdef WIN32 #elif WIN64 #endif

    我遇到过一些示例代码 http bojan komazec blogspot de 2011 10 conditional compilation of resource html事情是这样的 ifdef WIN32 elif WIN64
  • python中许多正则表达式的速度

    我正在编写一个处理大量字符串 文件的 python 程序 我的问题是 我将看到一段相当短的文本 并且我需要在其中搜索相当广泛的单词 短语的实例 我想我需要编译正则表达式作为匹配文本中这些单词 短语的方式 然而 我担心这将花费很多时间 我的问
  • Resharper 多行方法调用括号对齐

    Resharper 正在格式化多行方法调用 如下所示 foo Bar x y 我希望它将右括号与第一行对齐 例如 foo Bar x y 我查看了 Resharper 代码布局选项 但找不到正确的设置 有人可以告诉我如何实现这种替代格式吗
  • 自动装配错误弹簧

    我是春天的新手 以前我曾经使用 spring context xml 配置自动接线 现在我的项目我们直接使用注释来注入bean 当我尝试自动连接 Mongo 存储库时 出现以下异常 下面是示例代码 暂存文档服务Impl Service pu
  • 在 Windows 10 上使用 Android Studio 设置向导运行英特尔® HAXM 安装程序需要很长时间

    我有一个新安装的 Android Studio 下载其组件后我一直停留在设置向导上Running Intel HAXM installer 我应该怎么办 如果我使用任务管理器结束 Android Studio 的任务 我下载的所有组件是否都
  • 在委托中使用“base”关键字会导致 System.BadImageFormatException

    我有一个奇怪的问题 我希望有人能启发我为什么会发生这种情况 我在基本抽象类中有一个受保护的方法 如下所示 protected T ForExistingEntity
  • 插入排序、合并排序和快速排序的测试用例

    我已经实现了 在Java中 插入排序 合并排序 修改合并排序和快速排序 ModifiedMergeSort 有一个用于元素 绑定 的变量 当要排序的元素小于或等于 bound 时 则使用插入排序对其进行排序 为什么版本 1 比版本 3 4
  • 无法使用 .ToListAsync() 扩展方法 (.net 4.7)

    我正在尝试使用扩展方法 ToListAsync 但由于某种原因 这个扩展方法不适合我 我的设置如下 Web 项目 Net 4 7 在这里我确实包括了using System Data Entity DataAcess项目 Net 4 7 在
  • 如何创建远程页面中定义的类的对象?

    例如 在远程网页中 有这样一段代码
  • 尝试将我的第一个 Node.js 应用程序部署到 Heroku 时,Web dynos 不断崩溃

    foreman start 创建与我的工作应用程序的链接 我有一个名为 Procfile 的文件 其中包含 web node server js 这是我的 package json name node example version 0 0
  • 如何查询流程实例的位置?

    我想获取进程中单个实例的当前位置 除了 id 之外 是否可以获取活动的名称作为返回值 您可以使用以下代码获取流程实例的当前位置 当流程在多个位置等待时 该代码还将为您提供活动的名称 package org camunda bpm impor
  • forEach 不会迭代 mongodb 中的所有集合

    我需要比较 mongo db 中的两个对象集合 我的 shell 脚本如下所示 Both arrays have 367 pretty big objects var list1 db collection1 find condition
  • 如何在 python 中抛出错误并使用自定义消息退出

    我见过有人建议在 Python 中使用 sys exit 我的问题是 是否有其他方法可以退出当前脚本的执行 我的意思是终止 并出现错误 像这样的事情 sys exit You can not have three process at th
  • git stash 留下修改过的文件吗?

    当我试图隐藏更改时 我遇到了一些奇怪的行为 我不是 git 专家 所以我希望有人能对此有所启发 在最新的分支上 我修改了跟踪文件 git status 显示已修改 git stash 响应 已保存工作目录和索引状态 WIP git stat
  • 如何删除“警告:异步存储已从反应本机核心中提取...”?

    我已经尝试过此屏幕截图中推荐的内容 通过使用这行代码import AsyncStorage from node modules react native community async storage 在我要导入的文件中async stor
  • Bootstrap 3 模态位置

    我在将模态窗口定位在窗口中心时遇到问题 它显示了右侧的位置 我缺少什么 这似乎是我无法解决的 CSS 问题 感谢您的建议 div class modal fade div class modal dialog div class modal
  • 在 3D 空间中使用 GLSL 绘制 2D 网格

    我希望使用 OpenGL 4 0 在 X 轴上的有限空间内绘制 2D 网格 我希望使用 GLSL 使用 vert frag 着色器等来渲染光线 使它们出现 它可以使用较旧的 OpenGL 2 0 方法通过最简单的代码来完成 但当然它不使用照
  • 如何使用 UIViewPropertyAnimator 进行自动布局?

    我可以在网上找到的所有示例UIViewPropertyAnimator使用通过设置框架布局的视图 而不是使用自动布局 这是视图通常的布局方式 使用自动布局时 视图会动画到我想要的位置 但之后我不确定如何将其设置回其 模型 位置 Move a