Rotación de animation principal alnetworkingedor del punto

Me gustaría hacer girar un IBOutlet alnetworkingedor de un punto específico en la vista primaria, actualmente solo sé cómo rotarlo alnetworkingedor de un punto de anclaje; sin embargo, quiero usar un punto fuera de la capa del object.

El ángulo de rotation se calcula con relación al encabezado del dispositivo desde el punto.

- (void)viewDidLoad{ [super viewDidLoad]; locationManager=[[CLLocationManager alloc] init]; locationManager.desinetworkingAccuracy = kCLLocationAccuracyBest; locationManager.headingFilter = 1; locationManager.delegate=self; [locationManager startUpdatingHeading]; [locationManager startUpdatingLocation]; compassImage.layer.anchorPoint=CGPointZero; } - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ // Convert Degree to Radian and move the needle float oldRad = -manager.heading.trueHeading * M_PI / 180.0f; float newRad = -newHeading.trueHeading * M_PI / 180.0f; CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"]; theAnimation.fromValue = [NSNumber numberWithFloat:oldRad]; theAnimation.toValue=[NSNumber numberWithFloat:newRad]; theAnimation.duration = 0.5f; [compassImage.layer addAnimation:theAnimation forKey:@"animateMyRotation"]; compassImage.transform = CGAffineTransformMakeRotation(newRad); NSLog(@"%f (%f) => %f (%f)", manager.heading.trueHeading, oldRad, newHeading.trueHeading, newRad); } 

¿Cómo puedo rotar el UIImageView alnetworkingedor (x, y) por alfa?

Para girar alnetworkingedor de un punto específico (interno o externo) puede cambiar el punto de anclaje de la capa y luego aplicar una animation de transformación de rotation regular similar a la que escribí en esta publicación de blog .

Solo debe tener en count que el punto de anclaje también afecta a dónde aparece la capa en la pantalla. Cuando cambie el punto de anclaje, también tendrá que cambiar la position para que la capa aparezca en el mismo lugar en la pantalla.

Suponiendo que la capa ya está colocada en su position inicial y que el punto para girar es conocido, el punto de anclaje y la position pueden calcularse de esta manera (tenga en count que el punto de anclaje está en el espacio de coorderadas de la unidad de los límites de la capa (es decir, que x y y varían de 0 a 1 dentro de los límites)):

 CGPoint rotationPoint = // The point we are rotating around CGFloat minX = CGRectGetMinX(view.frame); CGFloat minY = CGRectGetMinY(view.frame); CGFloat width = CGRectGetWidth(view.frame); CGFloat height = CGRectGetHeight(view.frame); CGPoint anchorPoint = CGPointMake((rotationPoint.x-minX)/width, (rotationPoint.y-minY)/height); view.layer.anchorPoint = anchorPoint; view.layer.position = rotationPoint; 

Luego, simplemente aplica una animation de rotation, por ejemplo:

 CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotate.toValue = @(-M_PI_2); // The angle we are rotating to rotate.duration = 1.0; [view.layer addAnimation:rotate forKey:@"myRotationAnimation"]; 

Solo tenga en count que ha cambiado el punto de anclaje para que la position ya no se encuentre en el centro del frame y si aplica otras transformaciones (como una escala) también serán relativas al punto de anclaje.

Traducido la respuesta de David a Swift 3:

  let rotationPoint = CGPoint(x: layer.frame.width / 2.0, y: layer.frame.height / 2.0) // The point we are rotating around print(rotationPoint.debugDescription) let width = layer.frame.width let height = layer.frame.height let minX = layer.frame.minX let minY = layer.frame.minY let anchorPoint = CGPoint(x: (rotationPoint.x-minX)/width, y: (rotationPoint.y-minY)/height) layer.anchorPoint = anchorPoint; layer.position = rotationPoint;