CoreAnimation вращение преобразования анимации направления - PullRequest
2 голосов
/ 05 февраля 2012

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

// 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];

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Вы можете сделать это, анимируя свойство layer 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) приведение.

0 голосов
/ 05 февраля 2012

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

...