【问题标题】:Understanding CGAfflineTransform in the context of Rotation在 Rotation 的上下文中理解 CGAfflineTransform
【发布时间】:2014-08-12 02:45:49
【问题描述】:

我正在做一些实验来学习 iOS 中的手势和动画。创建类似 Tinder 的界面就是其中之一。我正在关注本指南:http://guti.in/articles/creating-tinder-like-animations/

我了解图像位置的变化,但不了解旋转。我想我的问题是不理解 CGAfflineTransform。特别是以下代码:

CGFloat rotationStrength = MIN(xDistance / 320, 1);
CGFloat rotationAngle = (CGFloat) (2 * M_PI * rotationStrength / 16);
CGFloat scaleStrength = 1 - fabsf(rotationStrength) / 4;
CGFloat scale = MAX(scaleStrength, 0.93);
CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngle);
CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
self.draggableView.transform = scaleTransform;

这些值和计算来自哪里,例如:320、1-fabs(strength) / 4、.93 等?他们对最终的轮换有何贡献?

另一方面,Tinder 似乎结合了滑动和平移。他们是向图像添加滑动手势,还是仅考虑平移的速度?

【问题讨论】:

    标签: ios objective-c animation uigesturerecognizer uipangesturerecognizer


    【解决方案1】:

    该代码有很多magic constants,其中大部分可能被选中,因为它们产生了“看起来不错”的东西。这可能会让人难以理解。与其说是实际的变换,不如说是用于创建它们的值。

    让我们逐行分解,看看是否更清楚。


    CGFloat rotationStrength = MIN(xDistance / 320, 1);
    

    320 的值可能被假定为设备的宽度(在 6 和 6+ 出现之前,它是所有 iPhone 的纵向宽度)。

    这意味着xDistance / 320 是沿 x 轴有多远的一个因素(基于用户拖动的名称 xDistance)。当用户没有拖动任何距离时,这将是 0.0,当用户没有拖动任何距离时,这将是 1.0用户拖了 320 个点。

    MIN(xDistance / 320, 1) 取拖动距离因子的最小值和 1)。这意味着如果用户拖动超过 320 个点(因此距离因子将大于 1,则旋转强度永远不会大于 1.0。它不会保护负值(如果用户向左拖动, xDistance 将是一个负值,始终小于 1。但是,我不确定指南是否考虑了这一点(因为 320 是全宽,而不是半宽。

    所以,第一行是一个介于 0 和 1 之间的因子(假设没有负值),表示应该应用多少旋转。


    CGFloat rotationAngle = (CGFloat) (2 * M_PI * rotationStrength / 16);
    

    下一行计算实际的旋转角度。角度以弧度指定。由于 2π 是一个完整的圆(360°),因此旋转角度的范围是从一个完整的圆(22.5°)的 0 到 1/16。选择 1/16 的值可能是因为它“看起来不错”。

    两条线一起意味着当用户进一步拖动时,视图旋转得更多。


    CGFloat scaleStrength = 1 - fabsf(rotationStrength) / 4;
    

    从变量名来看,它看起来会计算视图应该缩放多少。但它实际上是在计算视图应该具有的比例因子。比例为 1 表示“正常”或未缩放的大小。当旋转强度为 0 时(当 xDistance 为 0 时),缩放强度将为 1(未缩放)。随着旋转强度增加,接近 1,这个比例因子接近 0.75(因为这是 1 - 1/4)。

    fabsf 只是浮点绝对值(fabsf(-0.3) 等于 0.3


    CGFloat scale = MAX(scaleStrength, 0.93);
    

    在下一行,计算实际的比例因子。它只是 scaleStrength 和 0.93 的最大值(缩小到 93%)。 0.93 的值是完全任意的,很可能正是作者认为吸引人的地方。

    由于比例强度范围从 1 到 0.75,并且比例因子从不小于 0.93,因此比例因子仅在 xDistance 的前三分之一处发生变化。接下来三分之二的所有比例强度值都将小于 0.93,因此不会改变比例因子。


    使用如上计算的 scaleFactor 和 rotationAngle,视图首先旋转(按该角度),然后按比例缩小(按该比例因子)。

    总结

    所以,简而言之。当视图向右拖动时(当 xDistance 接近 320 点时),视图在整个拖动过程中从 0° 线性旋转到 22.5°,并在前三分之一的拖动过程中从 100% 缩放到 93%(然后停留在93% 用于剩余的拖动手势)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2021-02-25
      相关资源
      最近更新 更多