изменить против часовой стрелки на по часовой стрелке с CGAffineTransformIdentity - PullRequest
1 голос
/ 05 августа 2009

У меня телефонный руль. На кассе, он идет на свою позицию с анимацией.

Пока угол не меньше 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];
}

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

1 Ответ

1 голос
/ 05 августа 2009

Я не уверен, что это за состояние, когда touchesEnded (в терминах поворота), и я предполагаю, что вы выбрали degToRadians (-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 будет идти кратчайшим путем, чтобы вернуться к обычному, поэтому если вы идете ровно на 1/2 пути, он может идти не в том направлении (по часовой стрелке или против часовой стрелки), которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...