2

Есть ли простой способ указать, должно ли изображение поворачиваться по часовой стрелке или против часовой стрелки в объективе C? У меня есть спидометр с иглой (дизайн, отражающий цены на автомобили) - он работает нормально, за исключением случаев, когда он ближе, чтобы игла вращалась вниз и выходила из экрана на другую сторону. Я хочу, чтобы он всегда вращался против часовой стрелки, чтобы перейти на более низкие цифры и по часовой стрелке, чтобы перейти к более высоким номерам. Вот мой сегмент кода:Ориентация анимации вращения поворота CoreAnimation

// figure out the minimum and maximum prices shown on the 
// speedometer 
float min = [_a.text floatValue] * 1000; 
float max = [_g.text floatValue] * 1000; 

// set calibration between number labels to be small or large 
int cal = SMALL_CALIBRATION; 
if ([_stickerPriceSetting floatValue] >= TRIGGERPRICE) 
    cal = LARGE_CALIBRATION; 

// set an animation duration of 1.5 seconds for the needle rotation 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.5]; 

// low prices (off speedometer) 
if (price < (min - cal)) 
    _needle.transform = CGAffineTransformMakeRotation(- M_PI/12); 

// price too high (off speedometer) 
else if (price > (max + cal)) 
    _needle.transform = CGAffineTransformMakeRotation(M_PI * 13/12); 

// need to have needle point to the price 
else { 
    float delta = (max - min); 
    float price_point = price - min; 
    _needle.transform = CGAffineTransformMakeRotation(price_point/delta * M_PI); 
} 

[UIView commitAnimations]; 

ответ

0

У меня была та же проблема со спидометром. Вы не можете указать направление вращения при анимации свойства transform. Он всегда будет иметь самый короткий путь. Я решил проблему, выполнив 2 анимации, если угол больше 180 градусов (вторая анимация начинается после 1-го окончания). Вы должны обратить внимание на правильное время анимации, чтобы оно стало гладко.

+0

Это полезно для меня - за исключением того, что я не знаю, будет ли угол от исходной точки до новой точки больше 180 градусов - если нет простого способа узнать, какой угол игла (UIView) в настоящее время? Я предполагаю, что мне придется написать кучу кода, сохранив старую цену и включив ее в движение иглы. –

2

Вы можете сделать это анимировать свойства слоя transform.rotation:

// figure out the minimum and maximum prices shown on the 
// speedometer 
float min = [_a.text floatValue] * 1000; 
float max = [_g.text floatValue] * 1000; 

// set calibration between number labels to be small or large 
int cal = SMALL_CALIBRATION; 
if ([_stickerPriceSetting floatValue] >= TRIGGERPRICE) 
    cal = LARGE_CALIBRATION; 

CGFloat angle; 
if (price < min - cal) 
    angle = -M_PI/12; 
else if (price > max + cal) 
    angle = M_PI * 13/12; 
else 
    angle = M_PI * (price - min)/(max - min); 

[UIView animateWithDuration:1.5 animations:^{ 
    [(id)_needle.layer setValue:[NSNumber numberWithFloat:angle] 
     forKeyPath:@"transform.rotation"]; 
}]; 

Если импортировать QuartzCore/QuartzCore.h вы не будете нуждаться в (id) актеров.

Смежные вопросы