Получение точного местоположения UITableViewCell - PullRequest
46 голосов
/ 08 июня 2011

Учитывая UITableView, как я могу найти местоположение определенного UITableViewCell? Другими словами, я хочу получить его кадр относительно моего экрана iPhone, а не относительно UITableView. Поэтому, если прокрутить мой UITableView, местоположение каждого UITableViewCell должно быть выше на экране и т. Д.

Ответы [ 9 ]

94 голосов
/ 08 июня 2011

Вы также можете использовать метод rectForRowAtIndexPath для получения местоположения UITableView, отправив для этого indexPath .

- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath

Так что используйте как показано ниже:

CGRect myRect = [tableView rectForRowAtIndexPath:indexPath];
59 голосов
/ 07 ноября 2012

Помимо rectForRowAtIndexPath необходимо учитывать прокрутку.

Попробуйте этот код:

 // Get the cell rect and adjust it to consider scroll offset
 CGRect cellRect = [tableView rectForRowAtIndexPath:indexPath];
 cellRect = CGRectOffset(cellRect, -tableView.contentOffset.x, -tableView.contentOffset.y);
22 голосов
/ 08 июня 2011

Попробуйте следующее (отправка nil в качестве параметра toView означает, что вы хотите преобразовать прямоугольник в координаты окна):

CGRect r = [cell convertRect:cell.frame toView:nil];

И помните, что если конкретная строка в данный момент не видна, то, возможно, не будет UITableViewCellдля этого - поэтому перед использованием этого кода вам может понадобиться проверить, является ли ячейка действительной (например, не nil)

9 голосов
/ 11 июня 2017

Swift 3

Относительно tableView:

let rect = self.tableView.rectForRow(at: indexPath)

Относительно Screen:

Если вы знаете толькоcell,

if let indexPath = tableView.indexPath(for: cell) {
     let rect = self.tableView.rectForRow(at: indexPath)
     let rectInScreen = self.tableView.convert(rect, to: tableView.superview)
}

Если вы знаете indexPath, вам не нужно вызывать оператор if.

8 голосов
/ 03 июня 2015

попробуй в

didSelectRowAtIndexPath метод

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];


        // get current location of selected cell

        CGRect rectInTableView = [tableView rectForRowAtIndexPath:indexPath];

        CGRect rectInSuperview = [tableView convertRect:rectInTableView toView:[tableView superview]];


         NSLog(@"Cell Y Is %f",rectInSuperview.origin.y);

        NSLog(@"Cell X Is %f",rectInSuperview.origin.x);
4 голосов
/ 01 июня 2012

Мне не хватило ответа Джалии, мне нужно было сделать еще несколько манипуляций, чтобы все заработало.Мой tableView был добавлен в viewController и его расположение справа на полпути вниз по экрану.Таким образом, вам нужно принять начало координат tableView в качестве смещения прокрутки.

CGRect rowRect = [tableView rectForRowAtIndexPath:indexPath];
CGPoint offsetPoint = [self.infoTableView contentOffset];

// remove the offset from the rowRect
rowRect.origin.y -= offsetPoint.y;

// Move to the actual position of the tableView
rowRect.origin.x += self.infoTableView.frame.origin.x;
rowRect.origin.y += self.infoTableView.frame.origin.y;
1 голос
/ 22 марта 2015

Для будущих зрителей у меня были проблемы с получением надежного кадра для ячеек в UITableView.Я пытался отобразить UIAlertController в стиле ActionSheet на iPad, который нуждается в презентации поповера.В итоге такой подход дал лучшие результаты:

// 44 is the standard height for a cell in a UITableView
// path is the index path of the relevant row
// controller is the UIAlertController
CGRect frame = CGRectZero;
frame.origin.y = 44 * path.row;
frame.origin.x = table.frame.origin.x;
frame.size = CGSizeMake(table.frame.size.width, 44);
controller.popoverPresentationController.sourceRect = [tableView convertRect:frame toView:self.view];
controller.popoverPresentationController.sourceView = self.view;
0 голосов
/ 01 февраля 2017

Swift-версия ответов Томаша и Джалии на случай, если кто-то (еще) с этим борется:

var cellRect = tableView.rectForRow(at: indexPath)
cellRect = cellRect.offsetBy(dx: -tableView.contentOffset.x, dy: -tableView.contentOffset.y)
0 голосов
/ 08 июня 2011

Если вам действительно нужно преобразовать определенную точку в окне, вы можете сделать это:

[yourAppDelegate.window convertPoint:[cell.contentView.center] fromView:[cell.contentView]];

Я использовал координату центра ячеек, но вы можете использовать любую точку, какую захотите.

Владимир прав, следите за рядами, которые не видны (или были переработаны).

-S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...