Как обнаружить касания 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
?
Ответы
Ответ 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");
}