Перемещение объекта без анимации в анимационном блоке - PullRequest
0 голосов
/ 16 ноября 2010

Я анимирую кучу кнопок, чтобы они двигались влево от экрана, а затем волшебным образом перемещались вправо от экрана. Я делаю это по телефону:

[NSTimer scheduledTimerWithTimeInterval:0.20 target:self selector:@selector(moveTheButtons) userInfo:nil repeats:YES];

в viewDidLoad.

Они оживляют довольно счастливо влево, но затем они оживляют назад вправо. Я просто хочу, чтобы они исчезли и снова появились за кадром. Поскольку я новичок, я предположил, что поскольку он был после вызова commitAnimations, он не будет анимирован. Я думаю, что проблема заключается в том, что анимации фактически «фиксируются» после возврата из функции moveTheButtons, но я не могу придумать элегантного (или стандартного) способа обойти это.

Как переместить UIButton с экрана, не анимируя его, желательно в функции moveTheButtons?

Как вы, вероятно, догадываетесь, я новичок в анимации на iPhone, поэтому, если вы видите какие-либо другие ошибки, я допускаю некоторые подсказки.

-(void)moveTheButtons{
NSLog(@"moveTheButtons");

[UIView beginAnimations:@"mov-ey" context:cloudA];
[UIView setAnimationDuration: .20];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cloudA.center = CGPointMake(cloudA.center.x-pos.x,cloudA.center.y);
[UIView commitAnimations];


if(cloudA.center.x < -100){
    //I don't want to animate this bit. 
    cloudA.center = CGPointMake(550,cloudA.center.y);
}

//NSLog(@"cloudA.center.x %f", cloudA.center.x);
}

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Вы можете временно отключить неявную анимацию свойств в блоке анимации, используя метод +[UIView setAnimationsEnabled:].Это может быть очень полезно во многих случаях.

Сделайте что-то вроде этого:

-(void)moveTheButtons {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: .20];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    CGPoint center = CGPointMake(cloudA.center.x - pos.x, cloudA.center.y);
    if (center.x < -100) {
        [UIView setAnimationsEnabled:NO];
        cloudA.center = CGPointMake(550, center.y);
        [UIView setAnimationsEnabled:YES];
    } else {
        cloudA.center = center;
    }
    [UIView commitAnimations];
}

В качестве примечания;нет необходимости давать анимации имя или контекст, если вы на самом деле не используете делегата, который отвечает на методы делегата.Просто передайте nil и NULL, как я сделал в этом примере.

1 голос
/ 16 ноября 2010

Пересчитайте точку, инвертируйте порядок и вернитесь, прежде чем анимировать блок.

Вы безоговорочно добавляете анимацию в движок во всех случаях.

-(void)moveTheButtons{
NSLog(@"moveTheButtons");

CGPoint mypoint = CGPointMake(cloudA.center.x-pos.x,cloudA.center.y);

if(cloudA.center.x < -100){
    //I don't want to animate this bit. 
    cloudA.center = CGPointMake(550,cloudA.center.y);
    return;
}


[UIView beginAnimations:@"mov-ey" context:cloudA];
[UIView setAnimationDuration: .20];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cloudA.center = mypoint;
[UIView commitAnimations];

}

Есть точка стиля оиспользуя возврат, а не if / else, но вы можете составить собственное мнение.

Cheers

...