2016-05-01 4 views
0
- (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))]; 
} 

Вот как я создаю представление и анимирую его, перемещаясь слева направо.Несколько анимационных просмотров NSTimer

Если я снова вызову метод «createCar», он просто создаст новый вид, но я не буду анимировать. Почему это?

Я хочу, чтобы иметь возможность создавать больше видов и анимации (moveCar).

+0

Почему вы опубликовали новый вопрос вместо обновления [ваш предыдущий] (http://stackoverflow.com/questions/36961009/multiple-instances-of-the-same-view-with -Различный-таймер)? – rmaddy

+0

В чем ваш 'normalSpeedValue' установлен? – hola

+0

@hola normalSpeedValue = 0.01 – Joe

ответ

0

Причина, по которой дополнительные вызовы к createCar создает неподвижно, но до сих пор видны автомобили, потому, что обратный вызов по таймеру, moveCar, имеют только ссылки на наиболее недавно созданный автомобиль, хранящемся в _car Иваре.

Прошедшие созданные машины по-прежнему видны, поскольку вид, который они были добавлены, все еще содержит ссылку на них и, следовательно, продолжает их рисовать.

Вы можете исправить это, создавая 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)]; 
    }]; 
} 

Это один простой способ сделать это. Но если вам нужна гибкость, как разные скорости для разных автомобилей, потребуется немного переработать, но не так много.

Надеюсь, это поможет!

0

Каждый раз, когда ваш ход становился 0, когда вызывается метод. объявила его как переменную экземпляра и установила ее начальное значение 0 (в вашем случае) в методе createCar. Я думаю, это вам нужно. надеюсь, это поможет :)

+0

Статические переменные объявляются один раз, а затем существуют для жизни вашей программы. Объявление не повторяется, и приращение работает. – hola

Смежные вопросы