iOS - indexPathForRowAtPoint не возвращает правильный indexPath с другой высотой ячейки

У меня есть UITableView, который содержит много ячеек. Пользователь может расширить ячейку, чтобы увидеть больше содержимого в этой ячейке, нажав кнопку расширения в этой ячейке (только одна ячейка может расширяться за раз):

<code>- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(selectedRowIndex == indexPath.row) return 205;
    else return 60;
}
</code>

В раскадровке я перетаскиваю UILongPressGesture в кнопку ячейки и называю ее longPress (ячейка настраиваемая, в ней 2 кнопки, 1 необходимо распознать LongPressGesture, а другую - увеличить высоту ячейки):

<code>@property (retain, nonatomic) IBOutlet UILongPressGestureRecognizer *longPress;
</code>

И во viewDidLoad:

<code>- (void)viewDidLoad
{      
    [longPress addTarget:self action:@selector(handleLongPress:)];
}
</code>

Это работает отлично, однако когда я использую следующий код для распознавания indexPath ячейки, это неправильно, когда расширяется одна ячейка:

<code>- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {         
    // Get index path
    slidePickerPoint = [sender locationInView:self.tableView];
    NSIndexPath *indexPath= [self.tableView indexPathForRowAtPoint:slidePickerPoint]; 
    // It's wrong when 1 cell is expand and the cell's button I hold is below the expand button
}
</code>

Может ли кто-нибудь показать мне, как получить правильный indexPath, когда есть другая высота ячейки?
Заранее спасибо

 Dranix05 мая 2012 г., 09:55
Поблагодарить. Я обновил свой вопрос
 tipycalFlow05 мая 2012 г., 09:42
Пожалуйста, добавьте некоторый код для того, как вы добавилиUILongPressGestureRecognizer и как вы справились с расширением ячеек, иначе вы не получите хороших ответов.

Ответы на вопрос(2)

едставление:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
  initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];

Затем в обработчике жестов:

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
  if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
  { 
    CGPoint p = [gestureRecognizer locationInView:self.myTableView];

    NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row");
    else
        NSLog(@"long press on table view at row %d", indexPath.row);
    } 
}

Вы должны быть осторожны с этим, чтобы он не мешал обычному постукиванию пользователя по ячейке, а также обратите внимание, что handleLongPress может срабатывать несколько раз, прежде чем пользователь поднимает палец.

Спасибо...!

 05 мая 2012 г., 09:55
Хорошо, теперь обновите мой ответ ...!
 05 мая 2012 г., 09:54
Это только мое воображение или твой ответexactly такой же, как его текущий код (который не работает с расширенными ячейками)?
 05 мая 2012 г., 10:03
@Dinesh Не беспокойтесь о голосах ... беспокойтесь о качестве ваших ответов
 05 мая 2012 г., 09:43
Этот учебник не касается UIGestureRecognizer, который он хочет использовать для обнаружения длительного нажатия. Кажется, не решает его проблему.
 05 мая 2012 г., 09:45
Плохой ответ .....
Решение Вопроса

каждому UITableViewCell (в котором все используют один и тот же селектор), затем при вызове селектора вы можете получить ячейку через sender.view. Возможно, это не самое эффективное использование памяти, но если распознаватель единственного жеста не вернет правильный ряд в определенных ситуациях, этот способ должен работать.

Что-то вроде этого:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
  initWithTarget:self action:@selector(handleLongPress:)];
    [longPress setMinimumPressDuration:2.0];
    [cell addGestureRecognizer:longPress];
    [longPress release];

    return cell;
}

затем

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {  
    UITableViewCell *selectedCell = sender.view;
}

Ваш ответ на вопрос