Objective C UIImageView вращение с анимацией не работает хорошо - PullRequest
0 голосов
/ 30 ноября 2011

Я создаю компас в ячейке таблицы, поэтому у меня возникла проблема с поворотом представления изображения, которое начинается заново с позиции, которая является изображением в ресурсах.

это часть моего кода:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDelegate:self];

if(cellValue.direction == 0){
   cell.compass.transform = CGAffineTransformRotate(cell.compass.transform,DegreesToRadians([cellValue.fixedDirection floatValue]));
} else {
   cell.compass.transform = CGAffineTransformRotate(cell.compass.transform,DegreesToRadians([cellValue.direction floatValue]));   
}
[UIView commitAnimations];

cell.compass - это UIimageView, и у меня есть изображение с вертикальной стрелкой.если направление равно 0, то оно должно достигнуть этой степени и после получения угла от компаса переходит к предложению else.Таким образом, изображение начинает вращаться из этой вертикальной позиции, а не из последней повернутой позиции.

как получить последнюю повернутую позицию и продолжить оттуда

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Я нашел решение проблемы следующим образом:

NSLog(@"old dir %d: new dir: %d", [cellValue.oldDirection intValue], [cellValue.direction intValue]);
CABasicAnimation *animation =[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.duration = 0.5;

int oldDir = [cellValue.oldDirection intValue];
int newDir = [cellValue.direction intValue];


/// in didUpdateHeading
/// int result = 0;

/// result = fixedDir - orientation; 

/// place.oldDirection = place.direction;
/// place.direction = [NSNumber numberWithInt:result];

fixed dir - это направление в градусах с севера на это место!и ориентация - это текущая ориентация в градусах от компаса или trueHeading

if (oldDir*newDir < 0 && abs(abs(oldDir) - abs(newDir)) < 180) {
    oldDir = (360 + oldDir) % 360;
    newDir = (360 + newDir) % 360;
}

animation.fromValue = [NSNumber numberWithFloat:DegreesToRadians(oldDir)];
animation.toValue = [NSNumber numberWithFloat:DegreesToRadians(newDir)];


animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
[cell.compass.layer addAnimation:animation forKey:@"transform.rotation"];
float differenceAngle = [animation.toValue floatValue] - [animation.fromValue floatValue];
CATransform3D rotationTransform = CATransform3DMakeAffineTransform(CGAffineTransformRotate(cell.compass.transform,differenceAngle));

cell.compass.layer.transform = rotationTransform;

Надеюсь, я помог:)

0 голосов
/ 30 ноября 2011

Попробуйте повернуть слой вида с помощью removedOnCompletion = NO вместо поворота UIView

CALayer *layer = [cell.compass layer];
NSNumber *initRotation = [layer valueForKeyPath:@"transform.rotation"];
//CATransform3D rotationTransform = CATransform3DRotate(layer.transform, angle, 0.0, 0.0, 1.0);
//layer.transform = rotationTransform;

CABasicAnimation *animation =[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.duration = 0.5;
animation.fromValue = initRotation ;
animation.toValue = [NSNumber numberWithFloat:([initRotation floatValue] + angle)];
animation.removedOnCompletion = NO;
[layer addAnimation:animation forKey:@"transform.rotation"];
...