2016-05-01 8 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))]; 
} 

So erstelle ich eine Ansicht und animiere sie von links nach rechts.Mehrere NSTimer-Animationsansichten

Wenn ich rufe die Methode „createCar“ wieder, es wird nur eine neue Ansicht erstellen, aber ich werde nicht animieren. Warum das?

Ich möchte in der Lage sein, mehr Ansichten zu erstellen und animieren (moveCar).

+0

helfen Warum haben Sie eine neue Frage statt Aktualisierung [Ihre vorherige] Post (http://stackoverflow.com/questions/36961009/multiple-instances-of-the-same-view-with -unterschiedlicher Timer)? – rmaddy

+0

Worauf ist Ihr 'normalSpeedValue' eingestellt? – hola

+0

@hola normalSpeedValue = 0,01 – Joe

Antwort

0

Der Grund, dass keine weiteren Anrufe createCar schafft regungslos, aber immer noch sichtbar Autos ist, da der Rückruf auf dem Timer, moveCar, nur Bezug auf die zuletzt erstellte Auto in der _car Ivar gespeichert hat.

der Vergangenheit erstellt Autos sind immer noch sichtbar, weil die Sicht immer noch hinzugefügt wurden auf sie Bezug auf hält und damit weiter um sie zu zeichnen.

Sie können dieses Problem beheben, indem sie ein NSMutableArray für Ihre Autos zu schaffen, und fügte hinzu, sie zu ihm in createCar, und dann das Array Schleifen über jedes Auto in der moveCar Methode bewegt.

Beispielcode:

// ... 
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)]; 
    }]; 
} 

Dies ist eine einfache Möglichkeit, es zu tun. Aber wenn Sie Flexibilität wie verschiedene Geschwindigkeiten für verschiedene Autos wollen, wird es ein wenig Nacharbeit, aber nicht viel brauchen.

Hoffe, das hilft!

0

Jedes Mal, wenn Ihr Zug 0 wurde als Methode aufgerufen. deklariert es als Instanzvariable und setze seinen Anfangswert 0 (in deinem Fall) in createCar Methode. Ich denke, das willst du. hoffen, dass diese :)

+0

statische Variablen werden einmal deklariert und existieren dann für die Lebensdauer Ihres Programms. Die Deklaration wird nicht wiederholt und das Inkrement funktioniert. – hola

Verwandte Themen