多个NSTimer动画视图

时间:2016-05-01 00:13:35

标签: ios objective-c nstimer

- (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)。

2 个答案:

答案 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(在您的情况下)。我想你想要的。希望这会有所帮助:)