- (void)createCar
{
_car = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 10)];
[_car setBackgroundColor:[UIColor redColor]];
[self addSubview:_car];
_myTimer = [NSTimer scheduledTimerWithTimeInterval:normalSpeedValue target:self selector:@selector(moveCar) userInfo:nil repeats:YES];
}
- (void)moveCar
{
static int move = 0;
move = move+1;
[_car setFrame:(CGRectMake(move, 0, 40, 10))];
}
这就是我创建视图并使其从左向右移动的动画。
如果我调用方法" createCar"再次,它只会创建一个新的视图,但我不会动画。那是为什么?
我希望能够创建更多视图和动画(moveCar)。
答案 0 :(得分:0)
对createCar
的额外调用创建静止但仍然可见的汽车的原因是,计时器moveCar
上的回调仅引用存储在{{_car
中的最近创建的汽车。 1}} ivar。
过去创建的汽车仍然可见,因为它们被添加到的视图仍然保留对它们的引用,因此继续绘制它们。
您可以通过为您的汽车创建NSMutableArray
,在createCar
中将其添加到汽车中,然后使用moveCar
方法循环移动每辆汽车的数组来解决此问题。
示例代码:
// ...
NSMutableArray<UIView *> *_cars; // Be sure to init this somewhere
// ...
// ...
timer = NSTimer.schedule ... // Schedule time in viewDidLoad, or somwhere
// ...
- (void)createCar
{
UIView *_car = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 100, 100)];
[_car setBackgroundColor: [UIColor redColor]];
[self.view addSubview: _car];
[_cars addObject:_car];
}
- (void)moveCars
{
// go through each car
[_cars enumerateObjectsUsingBlock:^(UIView *car, NSUInteger i, BOOL *stop) {
// and set its frame.x + 1 relative to its old frame
[car setFrame: CGRectMake(car.frame.origin.x + 1, 0, 100, 100)];
}];
}
这是一种简单的方法。但是如果你想为不同的汽车提供不同速度的灵活性,那么它需要做一些改造,但不会太多。
希望这有帮助!
答案 1 :(得分:0)
当方法被调用时,每次移动都变为0。将其声明为实例变量,并在createCar
方法中将其设置为初始值0(在您的情况下)。我想你想要的。希望这会有所帮助:)