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

2

У меня есть 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, когда есть другая высота ячейки?
Заранее спасибо

Поблагодарить. Я обновил свой вопрос Dranix
Пожалуйста, добавьте некоторый код для того, как вы добавилиUILongPressGestureRecognizer и как вы справились с расширением ячеек, иначе вы не получите хороших ответов. tipycalFlow

Ваш Ответ

2   ответа
0

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

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

Спасибо...!

Хорошо, теперь обновите мой ответ ...!
Плохой ответ .....
Этот учебник не касается UIGestureRecognizer, который он хочет использовать для обнаружения длительного нажатия. Кажется, не решает его проблему.
@Dinesh Не беспокойтесь о голосах ... беспокойтесь о качестве ваших ответов
Это только мое воображение или твой ответexactly такой же, как его текущий код (который не работает с расширенными ячейками)?
6

каждому 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;
}

Похожие вопросы