Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Solve like this</p> <pre><code>- (void)rotateAccordingToAngle:(float)angle { [spinWheel setTransform:CGAffineTransformRotate(spinWheel.transform, angle)]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [spinWheel.layer removeAllAnimations]; previousTimestamp = event.timestamp; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; if (touch.view==spinWheel) { UITouch *touch = [touches anyObject]; CGPoint center = CGPointMake(CGRectGetMidX([spinWheel bounds]), CGRectGetMidY([spinWheel bounds])); CGPoint currentTouchPoint = [touch locationInView:spinWheel]; CGPoint previousTouchPoint = [touch previousLocationInView:spinWheel]; CGFloat angleInRadians = atan2f(currentTouchPoint.y - center.y, currentTouchPoint.x - center.x) - atan2f(previousTouchPoint.y - center.y, previousTouchPoint.x - center.x); [self rotateAccordingToAngle:angleInRadians]; CGFloat angleInDegree = RADIANS_TO_DEGREES(angleInRadians); revolutions+= (angleInDegree/360.0f); } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; if (touch.view==spinWheel) { NSTimeInterval timeSincePrevious = event.timestamp - previousTimestamp; CGFloat revolutionsPerSecond = revolutions/timeSincePrevious; NSLog(@"%.3f",revolutionsPerSecond); [self startAnimationWithRevolutions:revolutionsPerSecond forTime:5.0f]; } revolutions = 0; } - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { spinWheel.userInteractionEnabled = TRUE; if (timerUpdate) { [timerUpdate invalidate]; timerUpdate = nil; } } -(void)updateTransform{ spinWheel.transform = [[spinWheel.layer presentationLayer] affineTransform]; } -(void)startAnimationWithRevolutions:(float)revPerSecond forTime:(float)time { spinWheel.userInteractionEnabled = FALSE; float totalRevolutions = revPerSecond * time; timerUpdate = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateTransform) userInfo:nil repeats:YES]; [CATransaction begin]; [CATransaction setValue:[NSNumber numberWithFloat:time] forKey:kCATransactionAnimationDuration]; CABasicAnimation* spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; CGAffineTransform transform = spinWheel.transform; float fromAngle = atan2(transform.b, transform.a); float toAngle = fromAngle + (totalRevolutions*4*M_PI); spinAnimation.fromValue = [NSNumber numberWithFloat:fromAngle]; spinAnimation.toValue = [NSNumber numberWithFloat:toAngle]; spinAnimation.repeatCount = 0; spinAnimation.removedOnCompletion = NO; spinAnimation.delegate = self; spinAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut]; [spinWheel.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; [CATransaction commit]; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload