web-dev-qa-db-fra.com

Comment détecter les contacts sur UIImageView de l'objet UITableViewCell dans le style UITableViewCellStyleSubtitle

J'utilise l'objet UITableViewCell dans le style UITableViewCellStyleSubtitle (c'est-à-dire une vue d'image à gauche, étiquette de texte en gras et en dessous une étiquette de texte détaillée) pour créer ma table. Maintenant, je dois détecter les contacts sur le UIImageView et aussi connaître le chemin/cellule d'index dans lequel la vue de l'image a été cliquée. J'ai essayé d'utiliser

cell.textLabel.text = @"Sometext";
NSString *path = [[NSBundle mainBundle] pathForResource:@"emptystar1" ofType:@"png"];
UIImage *theImage = [UIImage imageWithContentsOfFile:path];
cell.imageView.image = theImage;
cell.imageView.userInteractionEnabled = YES; 

Mais ça ne marche pas. Chaque fois que l'image est cliquée, didSelectRowAtIndexPath: est appelé. Je ne veux pas créer un UITableViewCell distinct et y ajouter un bouton personnalisé. Existe-t-il un moyen de détecter les contacts sur le UIImageView lui-même?

30
Shri

Dans votre méthode cellForRowAtIndexPath ajoutez ce code

cell.imageView.userInteractionEnabled = YES;
cell.imageView.tag = indexPath.row;

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)];
tapped.numberOfTapsRequired = 1;
[cell.imageView addGestureRecognizer:tapped];   
[tapped release];

Et puis pour vérifier quel imageView a été cliqué, vérifiez l'indicateur dans la méthode selector

-(void)myFunction :(id) sender
{
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;
    NSLog(@"Tag = %d", gesture.view.tag);
}
75
user994299

La solution acceptée est actuellement cassée dans iOS 5.. Le bogue provoque le déclenchement de la reconnaissance des gestes de la vue d'image. Grâce à des recherches sur les forums de développeurs officiels, j'ai trouvé que c'est un bug connu dans iOS 5.. Elle est causée par une implémentation interne qui provoque -gestureRecognizerShouldBegin: pour retourner NON . Le bogue apparaît lorsque vous définissez le délégué du reconnaisseur de gestes sur la sous-classe UITableViewCell personnalisée elle-même.

correction consiste à remplacer -gestureRecognizerShouldBegin: dans le délégué du reconnaisseur de gestes et retournez OUI . Ce bug devrait être corrigé dans une future version d'iOS 5.x. Cela n'est sûr que tant que vous n'utilisez pas les nouvelles API de copier/coller UITableViewCell.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES;
}
18
Andrew

Pour Swift, dans votre méthode cellForRowAtIndexPath, ajoutez ce code

cell.imageView?.userInteractionEnabled = true
cell.imageView?.tag = indexPath.row

var tapped:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "TappedOnImage:")
tapped.numberOfTapsRequired = 1
cell.imageView?.addGestureRecognizer(tapped)

Et puis pour vérifier quelle imageView a été cliquée, vérifiez le drapeau dans la méthode de sélection

func TappedOnImage(sender:UITapGestureRecognizer){
    println(sender.view?.tag)
}
15
Esqarrouth

Vous pouvez le faire en créant une UIImageView à partir de votre image et en y ajoutant un identificateur de gestes. Voir l'exemple ci-dessous

//Create ImageView
UIImageView *theImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"emptystar1.png"]];
theImageView.userInteractionEnabled = YES;

//Add Gesture Recognizer
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelectedInTable)];
tapped.numberOfTapsRequired = 1;
[theImageView addGestureRecognizer:tapped];
[cell addSubview:theImageView];

//Memory Cleanup
[tapped release];
[theImageView release];

-(void)imageSelectedInTable
{
    NSLog(@"Selected an Image");
}

Cependant, vous devrez maintenant disposer davantage vos cellules car vous ne pouvez pas simplement utiliser la propriété UIImageView de UITableViewCell car elle est en lecture seule.

6
aahrens

Seulement comment des informations supplémentaires, dans mon cas, j'ai dû répondre à un geste de toucher sur un fichier image d'une cellule de tableau récupéré à partir de NSFetchedResultsController, nous avons donc besoin de l'indexPath, pas de la ligne, j'ai donc décidé d'utiliser l'image tapée elle-même au lieu de la informations sur la ligne. J'ai défini une variable pour l'image:

var imgSelected: UIImageView? = nil

J'ai ajouté le reconnaisseur de gestes à l'imageView (imgZona):

public override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.CellReuseIdentifier, forIndexPath: indexPath) as! ZonasTableViewCell
    let zona = fetchedResultsController.objectAtIndexPath(indexPath) as! Zona

    cell.infoZona = zona

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("imageTapped:"))

    cell.imgZona?.addGestureRecognizer(tapGestureRecognizer)
    cell.imgZona?.userInteractionEnabled = true

    return cell
}

et dans la méthode "imageTapped" j'ai récupéré l'image et sauvegardé dans la variable "imgSelected":

func imageTapped(sender: UITapGestureRecognizer) {

    imgSelected = sender.view as? UIImageView
    self.performSegueWithIdentifier("MuestraImagen", sender: self)
}

Enfin, dans la méthode "prepareForSegue", j'ai envoyé l'image du viewController dédicacé pour montrer l'image tapée:

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {
        switch identifier {
        case "MuestraImagen":
            if let vc = segue.destinationViewController as? MuestraImagenViewController {
                if imgSelected != nil {
                    if let img = imgSelected!.image {
                        vc.imgPuente = img
                    }
                }
            }
        default: break
        }
    }
}
2
jsbaes

Ce problème est:

  • Ajouter ImageView dans TableViewCell
  • Clic d'événement dans ImageView différent de clic d'événement dans TableViewCell

-> Les codes ci-dessous fonctionnent correctement avec moi:

cell.imageView.image = [UIImage imageNamed:@"my_image.png"];
[cell.imageView setUserInteractionEnabled:YES];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTapGestureCaptured:)];    
[cell.imageView addGestureRecognizer:singleTap];

et la fonction "singleTapGestureCaptured"

- (void)singleTapGestureCaptured:(UITapGestureRecognizer*)gesture{
    NSLog(@"Left Image clicked");
}
0
Bkillnest