【问题标题】:The transform property in CGPathAddEllipseInRectCGPathAddEllipseInRect 中的 transform 属性
【发布时间】:2011-04-26 21:54:14
【问题描述】:

我正在使用CGPathAddEllipseInRect 绘制一个圆圈,然后在 CAKeyframeAnimation 中使用它。我的问题是动画总是在同一个地方开始。我认为我可以使用 CGAffineTransform 执行以下操作,使其从不同的点开始:

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI / 2);
CGPathAddEllipseInRect(animationPath , &temp, rect);

我不知道这是在做什么。当它运行时,我什至看不到动画的这一部分。它正在做一些屏幕外的事情。任何帮助理解这一点都会很棒。

【问题讨论】:

    标签: cocoa core-animation quartz-graphics cgpath


    【解决方案1】:

    默认情况下围绕原点(0,0)进行旋转,但您想围绕圆心旋转,因此您必须进行额外的转换:

    float midX = CGRectGetMidX(rect);
    float midY = CGRectGetMidY(rect);
    CGAffineTransform t = 
        CGAffineTransformConcat(
            CGAffineTransformConcat(
                CGAffineTransformMakeTranslation(-midX, -midY), 
                CGAffineTransformMakeRotation(angle)), 
            CGAffineTransformMakeTranslation(midX, midY));
    CGPathAddEllipseInRect(animationPath, &t, rect);
    

    本质上,这会链接三个变换:首先,将圆移动到原点 (0,0),然后应用旋转,然后将其移回其原始位置。我做了一些可视化来说明效果:

    我选择了正方形而不是圆形,选择了45°而不是90°,以使旋转更容易看到,但原理是一样的。

    【讨论】:

    • 很好的答案 - 但你能解释一下吗?当你说原点时,我会假设它是我传递 CGPathAddEllipseInRect 的矩形的原点。但如果是这样的话,那么我仍然应该在屏幕上看到它,这不会发生。如果它是屏幕的原点,那么我假设我会看到它在屏幕的底角旋转四分之一,这也没有发生。当我在其中一个呼叫上记录矩形时,我得到了这个 - {{633.066, 600.916}, {40, 40}}。这些图层是随机放置的,这就是坐标看起来很有趣的原因。
    • 我为我的答案添加了一些额外的解释和可视化。希望这会有所帮助。
    • 感谢图表。它们使您更容易看到您的代码在做什么。我仍在苦苦挣扎的部分是我编写的代码正在做什么。根据您所说,我假设当我运行它时,我会在屏幕的左下角看到一个进出框架的圆圈。但什么都没有发生。我什至在 5,5 处放置了另一个点,以确保我有正确的角为 0,0。我的矩形的宽度和高度是 90.0,所以我认为它应该进入框架。再次感谢您的帮助。您是否推荐任何资源以更好地理解这一点?
    • 想象将第一张图像围绕原点 (0,0) 旋转 90°。之后一切都将在 X 轴下,因此视图的坐标系内不会有任何东西。您可以使用两张纸使其更易于可视化。我认为如果您尝试使用较小的角度(例如 π/4 (45°)),则更容易查看代码中发生的情况。
    • 您是否知道我可以查看的任何文档以更好地理解这一点。这不是我认为阅读 Apple 文档的方式。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2020-09-18
    • 1970-01-01
    • 2023-03-03
    • 2021-01-08
    • 2021-12-11
    • 2020-11-29
    • 2021-07-07
    相关资源
    最近更新 更多