Подтвердить что ты не робот

Как обнаружить касания UIImageView объекта UITableViewCell в стиле UITableViewCellStyleSubtitle

Я использую объект 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?

4b9b3361

Ответ 1

В вашем методе 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);
}

Ответ 2

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

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

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

Ответ 3

Для 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)

Затем, чтобы проверить, какой клик был выбран, проверьте флаг в методе выбора

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

Ответ 4

Один из способов сделать это - создать 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, так как оно только для чтения.

Ответ 5

Только, как дополнительная информация, в моем случае я должен был ответить на жест нажатия над файлом изображения ячейки таблицы, полученной из 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
        }
    }
}

Ответ 6

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

  • Добавить 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");
}