【问题标题】:Creating a Swingometer on the iPhone using Core-Animation使用 Core-Animation 在 iPhone 上创建 Swingometer
【发布时间】:2010-08-10 11:13:12
【问题描述】:

我正在尝试创建一个挥杆计,有点像高尔夫游戏中使用的挥杆计,用户按住按钮开始挥杆,在顶点释放以确定力量,此时“挥杆”反转方向,并且用户在向下的过程中再次点击以设置精度。

我想使用一个从左到右摆动的钟摆,而不是填满一个条。摆锤在第一次敲击的地方留下一个标记(功率),在第二次敲击的地方留下另一个标记(准确度)。

我的第一个问题是旋转钟摆。我一直在阅读这些关于旋转 UIImageView 的帖子 - here、here 和 here,但我希望我能得到一些额外的建议 :)

首先,旋转 UIImageView 是解决此问题的最佳方法吗?我正在考虑通过将钟摆的坐标与正确点的坐标进行比较来确定钟摆与正确点的距离。但要使其正常工作, UIImageView 必须物理移动,我不确定它是否会移动?此外,如何使 UIImageView 围绕特定点而不是中心点旋转。或者我应该只是让钟摆的边界框更大,这样中心点就在正确的位置。以及如何在用户点击(或释放)按钮的地方留下“印章”?

任何有关解决此问题的最佳方法的一般帮助将不胜感激 :) 也许我的问题有点模糊和笼统,但我希望有人会喜欢这个挑战 :)

谢谢!!

迈克尔

更新:

好的,我尝试了以下两种方法,现在都可以使用。

    - (void)viewDidLoad {
        pendulum.image = [UIImage imageNamed:@"winkOpen.png"];
        [self swingPendulum];
    }

    - (void)swingPendulum {
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadian(180)]; 
    rotationAnimation.duration = 0.75;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}


    /*
    - (void)swingPendulum {
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1];
        pendulum.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
        [UIView setAnimationDelegate:self];
        [UIView commitAnimations];
    }
    */

现在我不确定哪种方法更好,但在第一种方法中,钟摆摆动高于 0 度而不是低于 0 度,所以我会采用这种方法。

现在我需要确定钟摆在哪里停止并反转摆动...但也许我会将这些问题作为单独的问题发布,因为这有点混乱!我会确保我的问题将来更具体:)

【问题讨论】:

  • 我认为“Swingometer”,听起来很有趣!然后我读了这个问题,发现它是关于高尔夫的。叹。谈论失望。
  • 其实我并没有将它用于高尔夫比赛,我只是认为这是一个最能准确描述问题的例子。这很有趣,我保证:)
  • 您看到的那些“未定义符号”错误是因为您没有链接 QuartzCore 框架(其中包含核心动画类和数据类型)。另外,作为一个实际问题,用户在摆动时如何实际看到显示器?
  • 但是我已经像这样导入了 QuartzCore 库:#import 那应该可以吗?如果我没有它,我会收到更多来自编译器的投诉......至于看到显示 - 调用函数时不会播放此动画吗??
  • @Smikey - 这只是导入一个标题。您还需要链接框架(这些是您看到的链接器错误)。为此,请右键单击您的项目并转到添加 |现有框架...并从列表中选择 QuartzCore.framework。

标签: iphone objective-c uiimageview rotation cgaffinetransform


【解决方案1】:

对于动画,您需要查看变换。见Quartz 2D programming guide:Transforms.

您不应使用视图的实际像素位置进行计算。如果这样做,屏幕尺寸和/或分辨率的更改将需要完全重写。而是创建运动和位置的抽象数据模型,在抽象模型中执行计算。然后将抽象坐标转换为当前显示的坐标。

与首先计算它应该出现的位置相比,让 imageView 出现在您想要的位置相对来说是微不足道的。你必须让动作正确。记住,“如果你没有挥杆,那就没有意义了!”

【讨论】:

  • 感谢您的回答!从那以后,我决定不需要准确计算钟摆离正确的点有多远,只要它太强、太弱或恰到好处。我大概可以通过用户点击按钮时的角度来做到这一点。 IE。 170 和 190 = 太强。但是然后我需要从某个地方提取当前图像的变换角度......另外,我在简单地使钟摆摆动时遇到了麻烦 - 将发布我现在使用的代码并更新问题,所以非常感谢任何帮助跨度>
  • 转换是一个大话题。学习它们的真正诀窍是它们不会像你期望的那样积累。你有一个 45 度的旋转变换,你调用它两次。您会期望转换后的对象会旋转 90 度。它没有。无论您调用多少次,它都会旋转 45 度,因为变换总是从原始对象位置开始。要使变换累积,您必须变换现有的变换。因此,您设置了一个 45 度变换,然后在第一个变换上调用另一个 45 度变换。
  • 我明白了——好吧,我现在已经设法让钟摆朝一个方向摆动,但是正如你所说,当我应用二次变换使其向后摆动时,它会将变换应用到原始位置,而不是当前位置,因此钟摆只是从其原始位置反向摆动。因此,根据您的说法,我需要在应用反向变换之前将当前变换应用于钟摆本身。你知道我如何从当前动画中提取当前变换角度吗?我希望这是有道理的... :s 感谢您的帮助!
  • @Smikey - 您可以使用我在此答案中的代码提取旋转角度:stackoverflow.com/questions/877198/…,但最好的办法是使用 CATransform3DRotate() 从当前变换增量旋转变换,而不是而不是使用 CATransform3DMakeRotation()。
  • 好的 - 谢谢布拉德,我已经设法让它在某些情况下正常运行和工作。关于您在上面链接到的帖子,我有一个问题,由于某种原因,我无法对此发表评论,只能提交并回答。当我使用该代码提取角度时,如果钟摆摆动超过 180 度,则使用的三角函数会产生负角。我真的很希望它继续以 200 度作为右侧的最大值,如果可能的话,在左侧保持 -20 度。我的三角很生锈/坏,我不知道该怎么做。有什么建议么?谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2012-03-15
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多