19 votes

ios est-il possible pour un uiscrollview de détecter une simple pression de la part d'un utilisateur tout en conservant ses capacités de glissement et de défilement ?

J'utilise actuellement une UIScrollView pour faire défiler/glisser le curseur/le marqueur d'un graphique que j'affiche dans mon application. J'utilise scrollViewDidScroll, etc. pour détecter la position du contentoffset et manipuler ce que j'affiche à l'écran en fonction de cette position.

Ma question est de savoir s'il est possible de détecter une simple pression de l'utilisateur sur l'écran et d'obtenir la position de cette pression (pour ensuite définir le contentoffset à cette position) ?

J'ai lu quelques tutoriels qui décrivent la création d'une sous-classe de uiscrollview, mais il semble que ces sous-classes ne tiennent compte QUE d'une seule tape et non des glissements/défilements.

Quelqu'un a-t-il une idée de la manière dont je pourrais détecter le tapotement unique d'un utilisateur sur mon UIScrollView tout en conservant ses capacités de défilement et de glissement ?
Merci d'avance !

33voto

AJS Points 677

Utilisez le code suivant pour votre objet scrollView :

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
singleTapGestureRecognizer.enabled = YES;
singleTapGestureRecognizer.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTapGestureRecognizer];
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project

}

- (void)singleTap:(UITapGestureRecognizer *)gesture {  
//handle taps   
}

6voto

LondonGuy Points 2311

Swift 5

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:)))
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1
scrollViewTapGestureRecognizer.isEnabled = true
scrollViewTapGestureRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer)

@objc func scrollViewTapped(_ sender: UITapGestureRecognizer) {
    print("UIScrollView was tapped.")
}

2voto

ultramiraculous Points 319

La première partie de la question est assez simple à mettre en œuvre. Si vous avez une sous-classe UIScrollView, vous pouvez simplement ajouter une surcharge de touchesEnded qui ressemble à ceci :

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    if ([touch tapCount] == 1) {

        CGPoint location = [touch locationInView:self];

        [self setContentOffset:location animated:YES];

    }

}

Dans le cas de la vue défilante, le -locationInView pour le toucher aura en fait déjà le ContentOffset ajouté. Ce code fera défiler la vue défilante de sorte que le point touché par l'utilisateur se trouve en haut à gauche de la vue. Ce n'est probablement pas ce que vous voulez exactement, vous devrez donc ajouter un décalage si vous voulez que le défilement se termine à 10 pixels, ou créer un autre CGPoint avec seulement la valeur x de l'emplacement si votre scroller n'est pas de gauche à droite.

Cela n'empêchera pas de faire le défilement.

0voto

Jeffery Thomas Points 12768

Avez-vous envisagé d'attacher UITapGestureRecognizer à la scrollView ? J'ai attaché un UITapGestureRecognizer à un UIScrollView et j'ai utilisé la fonction –gestureRecognizerShouldBegin: et/ou –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: pour annuler la fonction panoramique intégrée lorsqu'une touche est souhaitée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X