0

ビューに画像をドラッグ アンド ドロップするために UIPanGestureRecogniser を追加しています。一度に 1 つの画像だけをドラッグしたいのですが、一度に 2 つの画像をドラッグできます。

朝からこのバグで立ち往生しています。Googleで見つけたすべての方法を試しました。

- (void)viewDidLoad
{
 [super viewDidLoad];
[self.view setMultipleTouchEnabled:NO];
for(UIImageView *iView in self.movableArray){
    if ([iView isMemberOfClass:[UIImageView class]]){
        UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        [iView addGestureRecognizer:recognizer];
        [iView setUserInteractionEnabled:YES];
        recognizer.delegate = self;
    }
}
}



 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
     [gameView bringSubviewToFront:[(UIPanGestureRecognizer *)recognizer view]];
     CGPoint translation = [recognizer translationInView:gameView];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                     recognizer.view.center.y + translation.y);
     [recognizer setTranslation:CGPointMake(0, 0) inView:gameView];
     self.dragObjectImageView =  (UIImageView*)recognizer.view;


if(recognizer.state == UIGestureRecognizerStateBegan){
     int ind = [self.movableArray indexOfObject:self.dragObjectImageView];
    for(int i = 0 ; i < [self.movableArray count] ; i ++){
        if( i != ind ){
            [[self.movableArray objectAtIndex:i] removeGestureRecognizer:recognizer];
        }

    }

    self.homePosition = self.dragObjectImageView.frame;
}
if (recognizer.state == UIGestureRecognizerStateEnded) {
    CGPoint touchPoint = [recognizer locationInView:gameView];
    for (UIImageView *iView in self.staticArray) {
        if ([iView isMemberOfClass:[UIImageView class]]) {
            if (touchPoint.x > iView.frame.origin.x &&
                touchPoint.x < iView.frame.origin.x + iView.frame.size.width &&
                touchPoint.y > iView.frame.origin.y &&
                touchPoint.y < iView.frame.origin.y + iView.frame.size.height)
            {
                self.dropTargetImageView = iView;
            }
        }
    }

    if(self.dragObjectImageView.tag == self.dropTargetImageView.tag){
        self.dragObjectImageView.frame = CGRectMake(self.dropTargetImageView.frame.origin.x, self.dropTargetImageView.frame.origin.y + self.dropTargetImageView.frame.size.height/2 - 15, self.dragObjectImageView.frame.size.width, self.dragObjectImageView.frame.size.height);
        [self.dragObjectImageView removeGestureRecognizer:recognizer];
        }
    }else{
        self.dragObjectImageView.frame = self.homePosition;

    }
}
}
4

2 に答える 2

1

UIPanGestureRecognizerこれは、それぞれに1 つ追加しているためですimageViews。あなたに1つだけ追加してみてくださいself.view(そしてあなたimageViewsを tosetUserInteractionEnabled:NOにします。そうしないと、タッチがトラップされます)。また置く

recognizer.maximumNumberOfTouches = 1;

ビューに追加する前に。あとは、どのイメージ ビューをhandlePanメソッドにドラッグするかをテストするだけです。レコグナイザーの状態を確認し、状態が変わったら、ドラッグされているUIGestureRecognizerStateBeganものを保存する必要があります。imageView次に、状態がUIGestureRecognizerStateChangedビューをドラッグするだけです。どのビューが触れられたかを知ることができる最も一般的な方法 (完全なビュー階層がわからないため) は、次のようにすることです。

NSUInteger index = [self.movableArray indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop)){
    UIView* hitTest = (UIView*)obj;
    return [hitTest pointInside:firstTouch withEvent:nil];
}];
if ( index != NSNotFound )
   self.draggingView = self.moveableArray[index];
else
   self.draggingView = nil;

もちろん、 self.draggingView が nil の場合、ユーザーがパンしているときに何もしません。

于 2013-10-25T15:06:27.200 に答える