Как обнаружить прикосновения к UIImageView объекта UITableViewCell в стиле UITableViewCellStyleSubtitle - PullRequest
30 голосов
/ 10 октября 2011

Я использую объект UITableViewCell в UITableViewCellStyleSubtitle стиль (т. е. представление изображения слева, текстовая метка, выделенная жирным шрифтом и текстовая метка под ним) для создания моей таблицы Теперь мне нужно обнаружить прикосновения к UIImageView, а также узнать путь / ячейку индекса, в которой щелкнул вид изображения. Я пытался использовать

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; 

Но это не работает. При каждом нажатии на изображение вызывается didSelectRowAtIndexPath:. Я не хочу создавать отдельный UITableViewCell и добавлять к нему пользовательскую кнопку. Есть ли способ обнаружить прикосновения к самой UIImageView?

Ответы [ 6 ]

75 голосов
/ 14 октября 2011

В вашем методе cellForRowAtIndexPath добавьте этот код

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];

А затем, чтобы проверить, на каком imageView нажали кнопку, установите флажок в selector метод

-(void)myFunction :(id) sender
{
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;
    NSLog(@"Tag = %d", gesture.view.tag);
}
18 голосов
/ 28 октября 2011

Принятое решение в настоящее время не работает в iOS 5.0 .Эта ошибка приводит к тому, что распознаватель жестов представления изображения никогда не срабатывает.Проведя исследование на официальных форумах разработчиков, я обнаружил, что это известная ошибка в iOS 5.0 .Это вызвано внутренней реализацией, которая заставляет -gestureRecognizerShouldBegin: возвращать NO .Ошибка появляется, когда вы устанавливаете делегат распознавателя жестов для самого пользовательского подкласса UITableViewCell.

Исправление должно переопределить -gestureRecognizerShouldBegin: в делегате распознавателя жестов и вернуть YES .Эта ошибка должна быть исправлена ​​в будущей версии iOS 5.x.Это безопасно только до тех пор, пока вы не используете новый UITableViewCell API копирования / вставки.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES;
}
15 голосов
/ 10 декабря 2014

Для Swift, в вашем методе cellForRowAtIndexPath добавьте этот код

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

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

А затем, чтобы проверить, какой imageView был нажат, отметьте флажок в методе селектора

func TappedOnImage(sender:UITapGestureRecognizer){
    println(sender.view?.tag)
}
6 голосов
/ 11 октября 2011

Один из способов сделать это - создать UIImageView из вашего изображения и добавить к нему распознаватель жестов. Смотрите пример ниже

//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");
}

Однако теперь вам придется больше размещать ячейки, поскольку вы не можете просто использовать свойство UIImageView UITableViewCell, поскольку оно доступно только для чтения.

2 голосов
/ 02 сентября 2015

Только как дополнительная информация, в моем случае мне пришлось отвечать на жест касания по файлу изображения ячейки таблицы, полученной из NSFetchedResultsController, поэтому нам нужен indexPath, а не строка, поэтому я решил использовать изображение, постучавшее само вместо строки информации. Я определил переменную для изображения:

var imgSelected: UIImageView? = nil

Я добавил распознаватель жестов в 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
}

и в методе «imageTapped» я извлек изображение и сохранил в переменной «imgSelected»:

func imageTapped(sender: UITapGestureRecognizer) {

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

Наконец, в методе "prepareForSegue" я отправил изображение посвященного viewController, чтобы показать постучанное изображение:

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
        }
    }
}
0 голосов
/ 09 февраля 2013

Эта проблема:

  • Добавление ImageView в TableViewCell
  • Клик события в ImageView отличается от клика события в TableViewCell

-> Нижекоды работают со мной корректно:

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];

и функция "singleTapGestureCaptured"

- (void)singleTapGestureCaptured:(UITapGestureRecognizer*)gesture{
    NSLog(@"Left Image clicked");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...