使用核心动画在iPhone上创建摇摆计

使用核心动画在iPhone上创建摇摆计,iphone,objective-c,uiimageview,rotation,cgaffinetransform,Iphone,Objective C,Uiimageview,Rotation,Cgaffinetransform,我正在尝试创建一个摆动计,有点像高尔夫游戏中使用的摆动计,用户按住按钮开始摆动,在顶点释放以确定功率,此时“摆动”反转方向,用户在下降过程中再次点击以设置精度 我想用一个从左到右摆动的钟摆,而不是用一个填满的杆。摆锤在第一次敲击的位置留下一个标记(功率),在第二次敲击的位置留下另一个标记(精度) 我的第一个问题是旋转钟摆。我一直在读这些关于旋转UIImageView的帖子,但我希望能得到一些额外的建议:) 首先,旋转UIImageView是实现这一点的最佳方式吗?我想通过比较摆锤的坐标和正确点的

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

我想用一个从左到右摆动的钟摆,而不是用一个填满的杆。摆锤在第一次敲击的位置留下一个标记(功率),在第二次敲击的位置留下另一个标记(精度)

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

首先,旋转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度以下摆动,所以我将采用这种方法


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

对于动画,您将希望了解变换。见

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


将imageView显示在您想要的位置与首先计算它应该位于的位置相比,是相对简单的。你必须使动议正确。记住,“如果你没有摆动,这并不意味着什么!”对于动画,你会想看看变换。见

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


将imageView显示在您想要的位置与首先计算它应该位于的位置相比,是相对简单的。你必须使动议正确。记住,“如果你没有秋千,这并不意味着什么!”我想“秋千计”,听起来很有趣!然后我读了这个问题,发现是关于高尔夫的。唉。说到失望,其实我不是在高尔夫比赛中使用它,我只是认为这是一个最能准确描述问题的例子。有趣的是,我保证:)您看到的那些“未定义符号”错误是因为您没有链接QuartzCore框架(其中包含核心动画类和数据类型)。另外,作为一个实际问题,用户在摆动时如何实际看到显示?但是我已经导入了QuartzCore库,如下所示:#导入应该不起作用吗?如果我没有它,我有一大堆来自编译器的抱怨。。。至于查看显示-当函数被调用时,这个动画不会播放吗???@Smikey-这只是导入了一个标题。您还需要链接框架(您看到的是链接器错误)。要做到这一点,右键单击您的项目并转到添加|现有框架。。。然后从列表中选择QuartzCore.framework。我觉得“SwingMeter”听起来很有趣!然后我读了这个问题,发现是关于高尔夫的。唉。说到失望,其实我不是在高尔夫比赛中使用它,我只是认为这是一个最能准确描述问题的例子。有趣的是,我保证:)您看到的那些“未定义符号”错误是因为您没有链接QuartzCore框架(其中包含核心动画类和数据类型)。另外,作为一个实际问题,用户在摆动时如何实际看到显示?但是我已经导入了QuartzCore库,如下所示:#导入应该不起作用吗?如果我没有它,我有一大堆来自编译器的抱怨。。。至于查看显示-当函数被调用时,这个动画不会播放吗???@Smikey-这只是导入了一个标题。您还需要链接框架(您看到的是链接器错误)。要做到这一点,右键单击您的项目并转到添加|现有框架。。。然后从列表中选择QuartzCore.framework。谢谢您的回答!我已经决定,我不需要精确地计算钟摆停在离正确点多远的地方,只要它太强、太弱或刚刚好。我可以通过用户点击按钮时的角度来推测。也就是说,<170度=太弱,>170度和<190度=刚好合适,>190度=太强。但是我需要从某处提取当前图像的变换角度。