Плавное вращение UIView с касанием
Мне интересно, как сгладить UITouch
в моем коде. Я могу обнаружить UItouch
на моем UIView
, но когда я пытаюсь повернуть вид с помощью CGAffineTransform
, он не вращается плавно. Я должен нажать или коснуться длинным пальцем iPhone для такого вращения.
Как я могу выполнять плавные вращения, как приложение Roambi Visualizer.
Спасибо за вашу помощь.
3 ответа:
transform
является анимируемым свойством UIView, поэтому вы можете использовать основную анимацию, чтобы сделать вращение плавным:CGAffineTransform newTransform = //...construct your desired transform here... [UIView animateWithDuration:0.2 animations:^{view.transform = newTransform;}];
Привет всем я нашел следующее решение моего вопроса и его работы для меня в touchesMoved.....
Вот код....
UITouch *touch = [touches anyObject]; CGPoint currentLocation = [touch locationInView:self.superview]; CGPoint pastLocation = [touch previousLocationInView:self.superview]; currentLocation.x = currentLocation.x - self.center.x; currentLocation.y = self.center.y - currentLocation.y; pastLocation.x = pastLocation.x - self.center.x; pastLocation.y = self.center.y - currentLocation.y; CGFloat angle = atan2(pastLocation.y, pastLocation.x) - atan2(currentLocation.y, currentLocation.x); CGAffineTransform transform = CGAffineTransformMakeRotation(angle); // Apply the affine transform [[self.superview viewWithTag:ROTATE_VIEW_TAG] setTransform:transform] ;
Это может быть или не быть давно мертвым, но есть несколько небольших проблем с ответом Кэма.
pastLocation.y = self.center.y - currentLocation.y;
Должно быть
pastLocation.y = self.center.y - pastLocation.y;
Если вы хотите сделать это в swift, я использовал ответ Кэма, чтобы выяснить следующее:
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { var touch: UITouch = touches.first as! UITouch var currentTouch = touch.locationInView(self.view) var previousTouch = touch.previousLocationInView(self.view) currentTouch.x = currentTouch.x - self.view.center.x currentTouch.y = self.view.center.y - currentTouch.y previousTouch.x = previousTouch.x - self.view.center.x previousTouch.y = self.view.center.y - previousTouch.y var angle = atan2(previousTouch.y, previousTouch.x) - atan2(currentTouch.y, currentTouch.x) UIView.animateWithDuration(0.1, animations: { () -> Void in bigCircleView?.transform = CGAffineTransformRotate(bigCircleView!.transform, angle) }) }