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?
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);
}
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;
}
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)
}
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.
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
}
}
}
Ce problème est:
-> 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");
}