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