Вращающийся UIView (снова)
Я снова столкнулся с некоторыми проблемами при повороте uiview. На этот раз я пытаюсь повернуть uiview на 1/12 скорости другого uiview, я вращаюсь с нормальной скоростью. Тем не менее, когда я пытаюсь выполнить эту задачу, я пытаюсь двигаться медленнее, как это:
Первое обновление https://www.youtube.com/watch?v=wj3nRJo5CMM&feature=youtu.be
2-е обновление https://www.youtube.com/watch?v=YLRkUzXSDtQ&feature=youtu.be
Вот мой код:
- (void)rotateHand:(UIPanGestureRecognizer *)panGesture {
if ([(UIPanGestureRecognizer*)panGesture state] == UIGestureRecognizerStateBegan) {
CGPoint touchPoint = [panGesture locationInView:[self view]];
float dx = touchPoint.x - minHandContainer.center.x;
float dy = touchPoint.y - minHandContainer.center.y;
arcTanMin = atan2(dy,dx);
arcTanHour = atan2(hourHand.center.x - minHandContainer.center.x, hourHand.center.y - minHandContainer.center.y);
if (arcTanMin < 0) {
arcTanMin = 2 * M_PI + arcTanMin;
}
if (arcTanHour < 0) {
arcTanHour = 2 * M_PI + arcTanMin;
}
NSLog(@"arcTanMin %f", arcTanMin);
startTransformMin = minHandContainer.transform;
startTransformHour = hourHandContainer.transform;
}
if ([(UIPanGestureRecognizer*)panGesture state] == UIGestureRecognizerStateChanged) {
CGPoint pt = [panGesture locationInView:[self view]];
float dx = pt.x - minHandContainer.center.x;
float dy = pt.y - minHandContainer.center.y;
float ang = atan2(dy,dx);
if (ang < 0) {
ang = 2 * M_PI + ang;
}
float angleDifferenceM = arcTanMin - ang;
float angleDifferenceH = arcTanHour + angleDifferenceM * (1.0/12.0);
NSLog(@"angleDiffM %f", angleDifferenceM);
NSLog(@"angleDiffH %f", angleDifferenceH);
minHandContainer.transform = CGAffineTransformRotate(startTransformMin, -angleDifferenceM);
hourHandContainer.transform = CGAffineTransformRotate(startTransformHour, -angleDifferenceH);
}
}
1 ответ
Похоже, что вы используете arcTanMin в качестве исходного опорного угла и для минутной стрелки и часовой стрелки. Поэтому, когда вы делаете прыжок через ось X, оба angleDifferenceM
а также angleDifferenceH
совершаем прыжок (именно поэтому в момент прыжка угол часовой стрелки к оси y совпадает с углом минутной стрелки к оси x), но angleDifferenceH
не нужно совершать прыжок Изменить это:
float angleDifferenceH = angleDifferenceM * (1.0/12.0);
в
float angleDifferenceH = arcTanHour + angleDifferenceM * (1.0/12.0);
с соответствующим начальным значением для arcTanHour
,