我想创建一个简单的应用程序(道路战斗机的实际克隆http://youtu.be/CDMcY3wLd1Q),其中:矩形UIView(汽车)向左移动,如果用户按屏幕左侧,如果用户按下右侧则向右移动。
我已经想出如何识别触摸(两种方式:使用“UILongPressGestureRecognizer”和“touchesBegan:”功能),但我不明白如何创建动画。
伪代码看起来应该是这样(或者我错了):
if user touch
if touch.coordinate.x>160 then
while holding
UIView.coordinate.x += 0.01;
if touch.coordinate.x<160 then
while holding
UIView.coordinate.x -= 0.01;
答案 0 :(得分:1)
还有一个名为-(void)touchesEnded
的功能,所以当touchbegan时,你会继续将汽车向一个方向移动,并在调用touchesended时停止移动。
简单的解决方案是使用像bool carismovingleft
这样的标志来调用touchbegin中的循环移动函数:
- (void)touchesBegan... {
//mark the flag
self.carismovingleft = true;
//start moving the car
[self movingcar];
}
- (void)movingcar {
if (self.carismovingleft) {
//move the car subview to left a little bit
.......
//now we keep moving a little bit till someone stop it
//call moving again after a delay
//otherwise the car will move all the way in one frame
[self performSelector: @selector(movingcar) withObject:nil afterDelay:1];
}
}
- (void)touchesEnded... {
//stop flag
self.carismovingleft = false;
}
它只是一个如何实现它的基本概念,你需要自己编码。
答案 1 :(得分:1)
所以你希望你的对象在用户触摸并按住按钮时开始移动,并继续移动直到用户放开?
长按手势识别器会在您发出单次按键事件之前给您一个延迟。那不会起作用。
您需要实现touchesBegan / touchesEnded。 @ highwing方法的一些变体应该有用。您需要微调延迟间隔和每个间隔移动汽车的数量。
由于你想要左右移动,我可能会使用枚举来指定移动方向,然后在movingCar方法中使用switch语句来处理从一个方向移动的所有方向。
在此处高端领导之后,代码可能如下所示:
typedef enum
{
notMoving,
movingLeft,
movingRight
} movementDirections;
movementDirections currentDirection;
- (void)touchesBegan...
{
//mark the flag
if (touchPoint.x > 160)
{
currentDirection = movingRight;
}
else if (touchPoint.x < 160)
{
currentDirection = movingLeft;
}
//start moving the car
[self movingCar];
}
- (void)movingCar
{
switch self.currentDirection
{
case movingLeft:
//move the car subview to left a little bit
.......
//now we keep moving a little bit till someone stop it
//call moving again after a delay
//otherwise the car will move all the way in one frame
[self performSelector: @selector(movingCar) withObject:nil afterDelay:.1];
break;
case movingRight:
//move the car subview to right a little bit
.......
//now we keep moving a little bit till someone stop it
//call moving again after a delay
//otherwise the car will move all the way in one frame
[self performSelector: @selector(movingCar) withObject:nil afterDelay:.1];
break;
default:
break; //Do nothing (we're not moving.)
}
}
- (void)touchesEnded...
{
//stop flag
self.currentDirection = notMoving;
}
编辑:我是Allman style缩进(链接)的支持者。这是K&amp; R风格缩进的有效替代品,我鄙视。 @evlogii,请不要更改我的代码以使用K&amp; R样式。这是个人品味的问题。我不会将您的代码从K&amp; R风格转换为Allman风格,所以您不能将我的代码转换为K&amp; R风格,好吗?