web-dev-qa-db-fra.com

Comment savoir quelle vue a eu lieu un événement tactile?

Je souhaite faire glisser un UIImage sur l'un des boutons UIB et le repositionner en fonction du bouton sur lequel je le fais glisser.

Le problème que j'ai rencontré est que UITouch enregistre uniquement la vue où mon contact a commencé, j'aimerais accéder à la vue à laquelle mon contact se termine. Comment puis-je faire ceci?

Code:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];

    dealerBtnOrigin = [touch locationInView:self.view];

    //NSLog(@"%u %u",touch.view.tag, ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).tag);
    //CHECK TO SEE WHICH BUTTON WAS TOUCHED
    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];


    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];
    UIView *endView = [self.view hitTest:location withEvent:nil];

    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        NSLog(@"%u %u",endView.tag, touch.view.tag);
        if([buttons containsObject:(UIButton *)endView])
        {
            [[dealerBtns objectAtIndex:[table getButtonSeat]] setHidden:YES];
            [table passButton:touch.view.tag];
            [[dealerBtns objectAtIndex: touch.view.tag] setHidden:NO];
        }
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = dealerBtnOrigin;
    }

}
17
Declan McKenna

Il est très facile de détecter votre vue finalement touchée, essayez ce code

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint location = [[touches anyObject] locationInView:self.view];
    CGRect fingerRect = CGRectMake(location.x-5, location.y-5, 10, 10);

    for(UIView *view in self.view.subviews){
        CGRect subviewFrame = view.frame;

        if(CGRectIntersectsRect(fingerRect, subviewFrame)){
            //we found the finally touched view
            NSLog(@"Yeah !, i found it %@",view);
        }

    }

}

Utilisez hit-testing. Vous connaissez l'emplacement de ce point en tant que CGPoint en termes de superview ultime, self.view. Ensuite, vous pouvez demander à self.view à quelle sous-vue ce point se trouve:

CGPoint location = [touch locationInView:self.view];
UIView* v = [self.view hitTest:location withEvent:nil];

UIView v est la vue que vous recherchez.

23
matt

En supposant qu'il existe un @property de la vue cible dans votre conteneur et que la vue cible est ajoutée au conteneur:

@property (nonatomic, strong) UIView* targetView;

// ...

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSSet* touchesForTargetView = [event touchesForView:self.targetView];
    if (touchesForTargetView.allObjects.count != 0) {
        // touch was at target view
    }
    else {
        // touch  was somewhere else
    }    
}
0
Yevhen Dubinin

En général, vous devez indiquer le point où le toucher s'est terminé et déterminer s'il se situe dans la vue qui vous intéresse. Pour ce faire, utilisez un code similaire à celui-ci:

CGPoint newCenter = dragView.center;
for (UIView *v in dropTargets)
{
    CGRect convertedTargetFrame = [v.superview convertRect:v.frame toView:nil];
    if (CGRectContainsPoint(convertedTargetFrame, newCenter))
    {
        activeTargetIndex = idx;
    }
}

(ce code a été édité à la volée pour supprimer beaucoup de choses non pertinentes, mais je garde une liste de cibles de dépôt potentielles dans dropTargets, et il suffit de regarder cette liste pour voir laquelle des vues UIViews potentielles pourrait contenir le point).

L'essentiel est que, si vous connaissez la ou les vues sur lesquelles vous faites éventuellement glisser l'élément, vous pouvez déterminer si le cadre de cette vue contient le point à l'aide de CGRectContainsPoint. L'important est de garder à l'esprit qu'ils peuvent se trouver dans différents systèmes de coordonnées et qu'il peut être nécessaire de passer de l'un à l'autre avant votre comparaison.

0