自动布局、UIDynamics 和动画

2024-05-20

我对自动布局还很陌生,并且对如何为视图设置动画感到困惑。

我读了很多,我知道你必须遵守限制,编辑它,然后包装layoutIfNeeded in an UIView动画块。

但当真正要做的时候,我却有点失落。我很乐意有人能向我解释如何做这个动画 https://www.youtube.com/watch?v=BxDVMtOHgFw例如完成。

我认为它可能使用UIPanGestureRecognizer改变constant容器约束的前导空间,但它可能使用 UIDynamics (用于右侧的反弹效果?)。


好吧,类似的行为可以通过以下方式实现UIPanGestureRecognizer + [UIView animateWithDuration:animations:]。是的,您设置前导空间约束并根据UIPanGestureRecognizer状态。请记住,您只需设置最终约束(定义滑块的最终位置)。中间动画位置已为您计算。对于滑块我们有default左侧位置和活性中间位置。

对于视图旋转,我们可以使用transform的财产UIView.

IB 中的自动布局约束:

设置动画选项(UIViewAnimationOptionCurveEaseOut动画曲线)可以给人一种反弹效果的感觉。UIPanGestureRecognizer代码(省略实例变量声明,因为它们的名称是不言自明的):

- (IBAction)onPan:(UIPanGestureRecognizer*)sender
{
    switch (sender.state) {
        case UIGestureRecognizerStateBegan:
            _startOffset = self.leadingSpace.constant;
            _maxOffset = self.slider.superview.frame.size.width
                - kHorizontalPadding
                - self.slider.frame.size.width;
            break;

        case UIGestureRecognizerStateChanged: {
            CGFloat offset = _startOffset + [sender translationInView:self.slider.superview].x;
            offset = MIN(offset, _maxOffset);

            self.leadingSpace.constant = offset;
            break;
        }

        case UIGestureRecognizerStateEnded: {
            CGFloat offset = _startOffset + [sender translationInView:sender.view.superview].x;
            UIColor *bgColor = [UIColor lightGrayColor];
            CGFloat rotation = 0;

            if (offset < _maxOffset) {
                offset = kHorizontalPadding;
            }
            else {
                offset = (_maxOffset + kHorizontalPadding)/2;
                bgColor = [UIColor redColor];
                rotation = M_PI_2;
            }

            self.leadingSpace.constant = offset;

            [UIView
             animateWithDuration:.5
             delay:0
             options:UIViewAnimationOptionCurveEaseOut
             animations:^{
                 [self.slider layoutIfNeeded];
                 self.slider.backgroundColor = bgColor;
                 self.slider.transform = CGAffineTransformMakeRotation(rotation);
             } completion:nil];

            break;
        }

        default:
            break;
    }
}

动画结果UIViewAnimationOptionCurveLinear(捕获模拟器):

动画结果UIViewAnimationOptionCurveEaseOut(捕获模拟器):

用户界面动力学

使用 UIDynamics 事情变得更加复杂。好的起点是Ray Wenderlich UIKit 动力学教程 http://www.raywenderlich.com/50197/uikit-dynamics-tutorial.

对于弹跳滑块,我们可以添加以下行为:

  • UIGravityBehavior它将滑块拉到起始位置。我们需要改变angle将重力指向左侧的属性。
  • UICollisionBehavior它定义了允许移动的左边缘和右边缘。translatesReferenceBoundsIntoBoundary如果我们将父视图视为边界,属性将很有用。此外,我们还需要添加额外的边界来阻止滑块在中间使用addBoundaryWithIdentifier:fromPoint:toPoint(或贝塞尔路径)。
  • UIDynamicItemBehavior改变elasticy并且可能resistance属性分别配置弹跳和加速度。
  • 可能UIPushBehavior与识别器结合使用velocityInView:指定用户释放滑块时的滑块速度
  • 可能UISnapBehavior作为替代UIGravityBehavior
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动布局、UIDynamics 和动画 的相关文章

随机推荐

  • 选项卡索引不适用于面板中的控件?

    我有一个 vb net Windows 窗体 其中包含大约 15 个组合框和 15 个文本框 以及其他几个控件 所有这些TextBoxes and ComboBoxes位于面板中 原因是我需要根据用户选择 输入的内容来调整控件的可见属性 因
  • C# 扩展方法 - 设计模式

    我想知道 C 扩展方法是否基于任何现有的设计模式 设计模式只是一种众所周知的范例 即 当你想实现 X 时 就做 Y 面向对象语言 例如 C 中的一个众所周知的范例是 当您想要对对象的状态进行操作时 调用它的实例上的方法 但是 在创建扩展方法
  • 使用数据帧的 R 中的 EWMA 波动性

    我正在尝试从一系列股票每日收益中获取 EWMA 波动性 这些收益来自一个名为base retorno diario Data IBOV ABEV3 AEDU3 ALLL3 BBAS3 BBDC3 BBDC4 1 2000 01 04 0 0
  • 输入类型=图像 - onclick(),将触发其事件,但在 jquery 中的函数上表现不佳

    我认为这可能是两篇文章 2个问题 所以如果你对此发表评论 我会将它们分开 主要问题实际上是 我怎样才能为按钮设置图像背景 简单且正确 我想现在我可以确定这些事实了 因为我在将图像设置为按钮背景时遇到了 小 问题 我想 好吧 如果很难设置的话
  • C++ 头文件和实现文件:要包含哪些内容?

    有一个 h 文件和一个 cpp 文件 它们具有相同的名称但扩展名不同 如果我想使用 cpp 文件中的内容 是否包含 h 文件或 cpp 文件 简单的答案是您几乎总是希望包含 h 文件并编译 cpp 文件 CPP 文件 通常 是真实代码 H
  • MVP - 演示者应该使用 Session 吗?

    我正在为网页使用模型 视图 演示者模式 演示者应该知道会话还是应该只有视图知道它 我想我的意思是像会话这样的概念与视图的体系结构非常相关 所以它们应该仅限于视图使用吗 否则 如果我想在不同架构的类似页面上重用演示者 会发生什么 或者我不需要
  • 在 PDB 中迭代字典时出现“语法错误:解析时出现意外的 EOF”

    我有一个pdba 内的跟踪集GET要求 我想打印请求对象的所有属性 我正在 pdb 中尝试以下操作 Pdb request
  • Java:执行 /cmd /c start path-with-spaces\program.exe

    我已经阅读了很多有关该问题的内容 但我找到的答案并不完全有效 我尝试运行这段代码 String args cmd c start C Program Files XML Marker xmlmarker exe Runtime rt Run
  • 如何获取多个 Spinner View 中的 Item 数量并计算总价

    我正在列表视图 多个微调器 中为不同产品实现微调器 其图像在左侧 价格在右侧 用户可以选择每种产品的数量 数量 这项工作将在根据我的需要从 BaseAdapter 扩展的类中进行 在微调器的 getView 中 我设置了微调器视图 现在我想
  • Swift 3:如何去除UITableView屏幕截图的灰色区域

    我在从桌面视图的屏幕截图中删除灰色区域时遇到了问题 这是我尝试截图时的输出UITableView 实际上我隐藏了一些tableViewCell这是不需要的 可能这就是区域显示灰色的原因 任何帮助表示赞赏 非常感谢 Answer 我通过使用
  • 如何将字符串转换为浮点数? [复制]

    这个问题在这里已经有答案了 我需要转换变量 pi string 3 1415926 变成一个浮子 这是我正在处理的事情 你的线路应该是pi float float pi string float pi string 是一个浮点值 你不能给它
  • Twitter\OAuth2\Python 入门

    我正在尝试使用 python 连接到 twitter 但我发现它真的很令人沮丧 我读到的所有内容都表明我需要一个消费者密钥 一个消费者秘密 一个访问密钥和一个访问秘密 例如 使用python OAUTH2访问OAUTH保护的资源 http
  • 安装 Visual Studio 2013 Ultimate 时出错 - Microsoft Visual C++ 2013 x64 Minumn Runtime - 12.0.21005

    当尝试从 ISO 安装文件在 Win 7 Pro 计算机上安装 MS Visual Studio 2013 Ultimate Edition 时 我收到这些错误消息 你知道如何修复它吗 ERROR Microsoft Visual C 20
  • 如何从 pdf C# 中获取具有特定颜色的文本

    我必须将 pdf 文件中的数据放入特定的数据库结构中 这要求我能够从 pdf 文件中获取某些数据 由于 pdf 没有任何标签等 我想知道是否可以根据颜色获取文本 比如说我想要所有的红色文本 或者我想要文档中的所有斜体文本 这在 C 中可能吗
  • 管理和终止任何进程的强大方法

    我正在编写代码来并行运行实验 我无法控制实验的目的 它们可能会开放使用subprocess Popen or check output运行一个或多个附加子进程 我有两个条件 我希望能够终止超过超时的实验 并且我希望终止超过超时的实验Keyb
  • 通过 ASP.NET 网站管理员工具获得 Asp.Net 会员资格

    我使用 aspnet regsql 创建了一个数据库 该数据库是在 sql server 2008 中创建的 而不是在我的项目中的数据文件夹中创建的 我需要手动将其移动到该文件夹 吗 接下来 在网站管理工具中 我转到提供商部分并单击 测试
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • ZURB Foundation,以编程方式切换选项卡

    我使用 asp 与基础 有没有办法使用 JS 或 ASP 在一个选项卡之间切换到另一个选项卡 Link http foundation zurb com docs tabs php 简单选项卡 一个可能的解决方案是为选项卡链接分配一个 id
  • MediaStore.Images.Media.insertImage 已弃用

    我曾经使用保存图像MediaStore Images Media insertImage but insertImage方法现已弃用 这docs https developer android com reference android p
  • 自动布局、UIDynamics 和动画

    我对自动布局还很陌生 并且对如何为视图设置动画感到困惑 我读了很多 我知道你必须遵守限制 编辑它 然后包装layoutIfNeeded in an UIView动画块 但当真正要做的时候 我却有点失落 我很乐意有人能向我解释如何做这个动画