简体   繁体   中英

UIPanGestureRecognizer always move from location (0, 0)

I'd like to drag customView.
But, when I drag the customView, it always move from location (0, 0).

Please look at following image.
the red parts is the customView, and when I drag it, it move to the location.

在此处输入图片说明

How do I fix it to make move customView correctly?
I have this code.
labelview is the customView(subclass of UIView).

- (void)viewDidLoad
{
    [super viewDidLoad];

    _labelView = [[LabelView alloc]initWithFrame:CGRectMake(20, 60, 200, 100)];
    UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];
    [_labelView addGestureRecognizer:pan];
    [self.view addSubview:_labelView];
}

- (void)panAction:(UIPanGestureRecognizer *)sender
{
    CGPoint p = [sender translationInView:self.view];
    CGPoint movedPoint = CGPointMake(_labelView.center.x + p.x, _labelView.center.y + p.y);
    sender.view.center = movedPoint;
    [sender setTranslation:movedPoint inView:self.view];
}

While the other two answers are technically correct, they are not ideal solutions because when you add a gesture recognizer to self.view then anytime you drag anywhere in self.view you will drag your LabelView , but I imagine you only want to drag it when you actually have your finger on the LabelView itself.

So, just keep what you have, but change this one line:

[sender setTranslation:movedPoint inView:self.view];

to

[sender setTranslation:CGPointZero inView:self.view];

You have implemented the logic upside down. It has to be exactly other way around. Set the ´UIPanGestureRecognizer´ to UIViewController's view and set the center of your custom view.

- (void)viewDidLoad
{
    [super viewDidLoad];

    _labelView = [[LabelView alloc]initWithFrame:CGRectMake(20, 60, 200, 100)];
    UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];

    // [_labelView addGestureRecognizer:pan]; must be removed

    [self.view addGestureRecognizer:pan]; // must be added

    [self.view addSubview:_labelView];
}

- (void)panAction:(UIPanGestureRecognizer *)sender
{
    CGPoint p = [sender translationInView:self.view];
    CGPoint movedPoint = CGPointMake(_labelView.center.x + p.x, _labelView.center.y + p.y);
    [_labelView setCenter:movedPoint];
}

I solved by writing following code.
Thank you for answers.

- (void)viewDidLoad
{
    [super viewDidLoad];

    _labelView = [[LabelView alloc]initWithFrame:CGRectMake(20, 60, 200, 100)];
    UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];
    [_labelView addGestureRecognizer:pan];
    [self.view addSubview:_labelView];
}

- (void)panAction:(UIPanGestureRecognizer *)sender
{
    CGPoint p = [sender translationInView:sender.view];
    CGPoint movedPoint = CGPointMake(sender.view.center.x + p.x, sender.view.center.y + p.y);
    sender.view.center = movedPoint;
    [sender setTranslation:CGPointZero inView:sender.view];
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM