измените против часовой стрелки на по часовой стрелке с помощью CGAffineTransformIdentity

У меня есть телефонное колесо. При касании он перемещается в свою позицию с анимацией.

Пока угол не станет меньше 180 °, он возвращается по часовой стрелке. Нет проблем, с этим кодом:

 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 [UIView setAnimationBeginsFromCurrentState:YES];
 [UIView beginAnimations:nil context:NULL];
 [UIViewsetAnimationDuration:0.5];
 wheel.transform = CGAffineTransformIdentity;
 [UIView commitAnimations];
}

Но после этого все идет не так, и продолжает вращаться до полного поворота.

Я пытался сделать такую ​​анимацию:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.2];
wheel.transform = CGAffineTransformRotate(wheel.transform, degreesToRadians(-130));
[UIView commitAnimations];
[self performSelector:@selector(animatewheelViewToCenter) withObject:nil afterDelay:0.3];
}

- (void)animatewheelViewToCenter{
 [UIView setAnimationBeginsFromCurrentState:YES];
 [UIView beginAnimations:nil context:NULL];
 [UIViewsetAnimationDuration:0.3];
 wheel.transform = CGAffineTransformIdentity;
 [UIView commitAnimations];
}

Это работает, но анимация не плавная; изменение видно.


person Rufilix    schedule 04.08.2009    source источник


Ответы (1)


Я не уверен, в каком состоянии находится touchEnded (с точки зрения вращения), и я предполагаю, что вы выбрали градусыToRadians (-130), чтобы попытаться сделать это частично, и ожидаю, что следующий метод сделает все остальное. Это должно быть лучшее решение, которое, мы надеемся, даст ожидаемый результат. Я не уверен, что такое кадран и почему вы его вращаете, поэтому я просто поверну колесо.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.2];
    wheel.transform = CGAffineTransformMakeRotation(degreesToRadians(-130));
    // I would recommend that the degrees you rotate be half of whatever your rotation is.
    // this would make the wheel rotate to the home position more evenly
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animatewheelViewToCenter:finished:context:)];
    [UIView commitAnimations];
}

- (void)animatewheelViewToCenter:(NSString *)animationID finished:(NSNumber *)finished context:(id)context {
    [UIView setAnimationBeginsFromCurrentState:YES]; // you might need to make this NO
    [UIView beginAnimations:nil context:NULL];
    [UIViewsetAnimationDuration:0.2];
    wheel.transform = CGAffineTransformIdentity;
    [UIView commitAnimations];
}

РЕДАКТИРОВАТЬ: На самом деле, я бы, вероятно, сделал поворот (в примере -130 градусов) немного больше, чем половина, потому что CGAffineTransformIdentity выберет кратчайший путь, чтобы вернуться к обычному режиму, поэтому, если вы идите ровно на половину пути, он может пойти не в том направлении (по часовой стрелке или против часовой стрелки), которое вы хотите.

person Neil    schedule 04.08.2009
comment
Это правильно, способ, которым это делает операционная система, не подходит для этой цели, анимация сгребает кратчайший путь, чтобы вернуться к отступу, поэтому вы устраняете проблему - person Daniel; 05.08.2009
comment
Спасибо за ответ. Я редактирую свой код, чтобы изменить весь кадран на колесо. Но ваш код помогает мне, потому что время всегда прямо между анимацией to. Однако анимация все еще не плавная. - person Rufilix; 05.08.2009