objective-c uiimageview position touchesmoved

objective c - Crear una vista de imagen arrastrable



objective-c uiimageview (2)

He estado buscando en la red durante mucho tiempo y no he encontrado una manera concreta de hacer una vista de imagen arrastrable. Esto es lo que tengo hasta ahora:

tempViewController.h

#import <UIKit/UIKit.h> #import "MyRect.h" @class UIView; @interface tempViewController : UIViewController @property (nonatomic, strong) MyRect *rect1; @end

tempViewController.m

#import "tempViewController.h" @interface tempViewController () @end @implementation tempViewController @synthesize rect1 = _rect1; - (void)viewDidLoad { [super viewDidLoad]; _rect1 = [[MyRect alloc]initWithFrame:CGRectMake(150.0, 100.0, 80, 80)]; [_rect1 setImage:[UIImage imageNamed:@"cloud1.png"]]; [_rect1 setUserInteractionEnabled:YES]; [self.view addSubview:_rect1]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches]anyObject]; if([touch view] == _rect1) { CGPoint pt = [[touches anyObject] locationInView:_rect1]; NSLog(@"%@",NSStringFromCGPoint(pt)); _rect1.center = pt; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches]anyObject]; if([touch view] == _rect1) { CGPoint pt = [[touches anyObject] locationInView:_rect1]; NSLog(@"%@",NSStringFromCGPoint(pt)); _rect1.center = pt; } } @end

MyRect ahora es una clase UIImageView vacía.

Al arrastrar la imagen desde un punto como [532,589] en micra, se mueve a una parte totalmente diferente de la pantalla, como [144, 139]


No use -touchesBegan:withEvent: etc.

Lo que quiere usar para tales cosas de "alto nivel" son UIGestureRecognizers .

Debería agregar un reconocedor de movimiento de pan a su vista para configurar un delegado (posiblemente la vista en sí), y en la devolución de llamada mover la vista por la distancia que se movió el reconocedor.

O recuerdas la posición inicial y te mueves por -translationInView cada vez, o simplemente te mueves por la traducción y luego usas -setTranslation:inView: para restablecer la traducción de reconocedores a cero, así que en la siguiente llamada del método de delegado, -setTranslation:inView: obtener el movimiento desde la última llamada.


Simplemente adjunte un UIPanGestureRecognizer a su vista. En la acción del reconocedor, actualice el centro de su vista en función de la "traducción" (compensación) del reconocedor, luego restablezca la traducción del reconocedor a cero. Aquí hay un ejemplo:

- (void)viewDidLoad { [super viewDidLoad]; UIView *draggableView = [[UIView alloc] initWithFrame:CGRectMake(150, 100, 80, 80)]; draggableView.userInteractionEnabled = YES; draggableView.backgroundColor = [UIColor redColor]; [self.view addSubview:draggableView]; UIPanGestureRecognizer *panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panWasRecognized:)]; [draggableView addGestureRecognizer:panner]; } - (void)panWasRecognized:(UIPanGestureRecognizer *)panner { UIView *draggedView = panner.view; CGPoint offset = [panner translationInView:draggedView.superview]; CGPoint center = draggedView.center; draggedView.center = CGPointMake(center.x + offset.x, center.y + offset.y); // Reset translation to zero so on the next `panWasRecognized:` message, the // translation will just be the additional movement of the touch since now. [panner setTranslation:CGPointZero inView:draggedView.superview]; }