voltear voltean selfies selfie para modo las invertir imagen fotos espejo efecto camara app iphone objective-c uiimageview cgaffinetransform

voltean - voltear imagen espejo iphone



iphone: ¿Cómo rotar una imagen rectangular con eventos táctiles? (3)

De la documentación sobre el método de transformación :

El origen de la transformación es el valor de la propiedad central o la propiedad anchorPoint de la capa si se modificó. (Utilice la propiedad de capa para obtener el objeto de capa subyacente de animación principal). El valor predeterminado es CGAffineTransformIdentity.

¡Entonces debería poder establecer el centro de su rotación de esta manera!

Y para determinar el ángulo de rotación, use la función atan2 o atan2f :

float angleInRadians = atan2f(touchPoint.y-circleCenter.y , touchPoint.x-circleCenter.x);

transformar una imagen cuadrada o redonda es fácil de hacer ...

¿Pero qué pasa si una imagen rectangular?

Esta es la imagen que quiero transformar con el evento táctil.

El centro del círculo es (30, 236), si toco cualquier lugar en la pantalla

Imageview transformará la flecha en mi punto de contacto.

Pero el centro del círculo sigue siendo el mismo lugar.

Intento transformar la imagen usando un ángulo de prueba

Se volverá así ...

Cómo ajustar la imagen?

También el código está aquí

- (void)viewDidLoad { CGRect arrowImageRect = CGRectMake(20.0f, 20.0f, 15.0f, 220.0f); arrow = [[UIImageView alloc] initWithFrame:arrowImageRect]; [arrow setImage:[UIImage imageNamed:@"arrow.png"]]; arrow.opaque = YES; [self.view addSubview:arrow]; [super viewDidLoad]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; NSLog(@"Position X: %f /n, Y: %f",touchPoint.x,touchPoint.y); CGAffineTransform transform = CGAffineTransformIdentity; arrow.transform = CGAffineTransformRotate(transform, ?????? ); }

Los ?????? parte debería ser la última solución ...

¿O tal vez necesito cambiar el tamaño de la imagen?

Gracias por cualquier respuesta o respuesta :-)

Webber


Puede volver a configurar el centro después de la transformación.

CGPoint centerBeforeTransform = view.center; //your transform code view.center = centerBeforeTransform;


Aquí está la solución final, me imagino este problema

revisa este código

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch=[[event allTouches]anyObject]; [self transformSpinnerwithTouches:touch]; } -(void)transformSpinnerwithTouches:(UITouch *)touchLocation { CGPoint touchLocationpoint = [touchLocation locationInView:self.view]; CGPoint PrevioustouchLocationpoint = [touchLocation previousLocationInView:self.view]; //origin is the respective piont from that i gonna measure the angle of the current position with respective to previous position .... CGPoint origin; origin.x = arrow.center.x; origin.y = arrow.center.y; CGPoint previousDifference = [self vectorFromPoint:origin toPoint:PrevioustouchLocationpoint]; CGAffineTransform newTransform = CGAffineTransformScale(arrow.transform, 1, 1); CGFloat previousRotation = atan2(previousDifference.y, previousDifference.x); CGPoint currentDifference = [self vectorFromPoint:origin toPoint:touchLocationpoint]; CGFloat currentRotation = atan2(currentDifference.y, currentDifference.x); CGFloat newAngle = currentRotation- previousRotation; temp1 = temp1 + newAngle; //NSLog(@"temp1 is %f",temp1); //NSLog(@"Angle:%F/n",(temp1*180)/M_PI); newTransform = CGAffineTransformRotate(newTransform, newAngle); [self animateView:arrow toPosition:newTransform]; } -(void)animateView:(UIView *)theView toPosition:(CGAffineTransform) newTransform { arrow.transform = newTransform; } -(CGPoint)vectorFromPoint:(CGPoint)firstPoint toPoint:(CGPoint)secondPoint { CGFloat x = secondPoint.x - firstPoint.x; CGFloat y = secondPoint.y - firstPoint.y; CGPoint result = CGPointMake(x, y); //NSLog(@"%f %f",x,y); return result; }