【问题标题】:CGAffineTransformScale not working with zero scaleCGAffineTransformScale 不适用于零比例
【发布时间】:2014-09-21 21:48:56
【问题描述】:

更新到 iOS 8,我注意到一个有趣的问题。我使用 CGAffineTransformScale 将图像视图缩放为零,其想法是它巧妙地从用户的视图中消失。它适用于iOS8,但现在根本不行。瞬间视野消失了;空白!

原来我用的是:

CGAffineTransform zoom = CGAffineTransformScale(CGAffineTransformIdentity, 0.0f, 0.0f);
myImageView.transform = zoom;

为什么到现在还有效的这个功能还没有被贬值?

【问题讨论】:

    标签: ios zooming scale cgaffinetransform cgaffinetransformscale


    【解决方案1】:

    CGAffineTransform 是一个 3x3 矩阵,其最右边的列永久设置为 (0, 0, 1)T。所以它实际上存储了六个值,分别称为 a、b、c、d、tx、ty。前四个控制旋转、缩放和倾斜。最后两个控件翻译。

    您可能认为从变换 T 到变换 U 的动画是一个简单的组件插值问题:T.aU.aT.bU.b,等等。(我会称之为“简单插值”。)

    你错了。

    好的,请在这里坚持。这个解释看起来很迂回,但我保证到最后你会明白为什么零比例会破坏动画。

    这是我制作的一个演示应用。它只是在恒等变换和 160˚ 旋转(不是 180˚)之间进行插值。

    请注意两件事:图像先缩小后扩大,并且角速度不均匀。旋转开始缓慢,加速,然后再次减速。那不是我生涩的手部动作;它确实使用简单的插值来表现这种方式。

    那么这里发生了什么?让我们看看中途的变换(80˚):

    文字:
    [0.030153692, 0.17101011, -0.17101011, 0.030153692, 0, 0]

    80˚ 的旋转变换应该是什么样的?像这样:
    [0.17364822, 0.98480773, -0.98480773, 0.17364822, 0, 0]

    您可能已经注意到,这些矩阵完全不同。仅表示旋转的变换具有多个属性:a*a + b*b == 1a == db == -c。真正的旋转矩阵具有所有这些属性,但简单插值矩阵没有。具体来说,它的 a*a + b*b == .030153695 与 1 相差甚远。这意味着它不仅代表旋转,还代表缩放。

    这意味着,一般而言,您不能仅在两个变换之间进行插值并获得不错的结果。所以系统做了一些更复杂的事情。

    Core Animation 将变换分解为四个部分:旋转角度、比例因子、剪切因子和平移。它对这些部分进行插值,并使用插值来计算动画的中间变换。

    “好的”,您的意思是,“但这与破坏动画的零尺度矩阵有什么关系?”

    您可以找到分解矩阵in this mathoverflow Q&A 的数学运算。请注意,要计算旋转角度和剪切因子,您需要除以矩阵的至少一个分量(该答案中的 A11 或 A21,@987654337 @ 或 bCGAffineTransform)。但是,当您按零因子缩放时,这些组件将变为零。你不能除以零。

    因此,当系统尝试分解您的转换时,它会失败并放弃。

    我并不是说这是好的行为,但这是我们生活的行为。

    【讨论】:

    • 谢谢 Rob,这是一个极好的描述为什么它不起作用。有趣的是,它确实在 iOS 8 之前的版本中工作!
    【解决方案2】:

    所以我所做的就是将缩放比例从零改为小:

    CGAffineTransform zoom = CGAffineTransformScale(CGAffineTransformIdentity, 0.001f, 0.001f);
    myImageView.transform = zoom;
    

    这很好用。恢复正常。

    我对这个解决方案很满意,我主要感兴趣的是把它作为一个解决方案提供给其他需要它的人,但我也想问,为什么会这样?

    (请保持友善 - 只是想帮助遇到这个问题的任何人。)

    【讨论】:

    • 如果你找到答案,就回答你自己的问题是正确的做法:帮助有同样问题的其他人。如果可以,您应该接受您的回答,以便问题显示为已回答。
    • 大卫,谢谢,我还是新手。但是 Rob Mayoff 刚刚发布了一个绝妙的答案;比我以往任何时候都好!我可能想出了一个变通办法,但 Rob 已经解释了为什么会这样。远胜于我的努力!
    • 是的,这是一个很好的答案。当你的答案是唯一的答案时,我发表了我的评论,并想告诉你,接受你自己的答案并没有错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多