我将用一种不同的技术来回答这个问题,平移手势。我不使用你的技术,所以我不能和它说话,但我一直使用以下内容:
UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)];
image01.userInteractionEnabled = YES;
[self.image01 addGestureRecognizer:pan];
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)];
image02.userInteractionEnabled = YES;
[self.image02 addGestureRecognizer:pan];
然后我有处理程序:
- (void)handlePanImage:(UIPanGestureRecognizer *)sender
{
static CGPoint originalCenter;
static UIImageView *imageview;
if (sender.state == UIGestureRecognizerStateBegan)
{
UIImageView *selectedImageView = (UIImageView *) sender.view;
imageview = [[UIImageView alloc] initWithFrame:selectedImageView.frame];
imageview.image = selectedImageView.image;
imageview.alpha = 0.8;
[sender.view.superview addSubview:imageview];
originalCenter = imageview.center;
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [sender translationInView:sender.view.superview];
imageview.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
[imageview removeFromSuperview];
imageview = nil;
CGPoint translation = [sender translationInView:sender.view.superview];
// do whatever you want to at the end, in this case, animating the moving
// of the old image to the new location. perhaps you don't want to move your
// old image, but leave it there, maybe you just want to change the alpha of
// what you dragged back to 1.0 and snap it into place. Just do whatever you
// want here. Note, in this latter scenario, if you want to be able to drag
// the new image back out, you'll have to create a new pan gesture recognizer
// for it.
[UIView animateWithDuration:0.2
animations:^{
sender.view.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);;
}];
}
else if (sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed)
{
[imageview removeFromSuperview];
imageview = nil;
}
}
您也可以,而不是为每个图像创建一个新的手势识别器,只需在父视图上创建一个,检测您结束的图像,然后继续。这可能看起来像:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSuperView:)];
[self.view addGestureRecognizer:pan];
接着:
- (void)handlePanSuperView:(UIPanGestureRecognizer *)sender
{
static CGPoint originalCenter;
static UIImageView *selectedImageView = nil;
static UIImageView *draggedImageView = nil;
if (sender.state == UIGestureRecognizerStateBegan)
{
selectedImageView = nil;
CGPoint location = [sender locationInView:sender.view];
for (UIImageView *imageview in _imageviews)
{
if (CGRectContainsPoint(imageview.frame, location))
selectedImageView = imageview;
}
if (selectedImageView)
{
draggedImageView = [[UIImageView alloc] initWithFrame:selectedImageView.frame];
draggedImageView.image = selectedImageView.image;
draggedImageView.alpha = 0.8;
[sender.view addSubview:draggedImageView];
originalCenter = selectedImageView.center;
}
}
else if (sender.state == UIGestureRecognizerStateChanged && selectedImageView)
{
CGPoint translation = [sender translationInView:sender.view];
draggedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);
}
else if (sender.state == UIGestureRecognizerStateEnded && selectedImageView)
{
[draggedImageView removeFromSuperview];
draggedImageView = nil;
CGPoint translation = [sender translationInView:sender.view];
// do whatever you want to at the end, in this case, animating the moving of the old image
[UIView animateWithDuration:0.2
animations:^{
selectedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);;
}];
}
else if ((sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) && selectedImageView)
{
[draggedImageView removeFromSuperview];
draggedImageView = nil;
}
}