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

Получение точного местоположения UITableViewCell

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

4b9b3361

Ответ 1

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

- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath

Поэтому используйте, как показано ниже:

CGRect myRect = [tableView rectForRowAtIndexPath:indexPath];

Ответ 2

Помимо 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);

Ответ 3

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

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

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

Ответ 4

попробуйте в

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);

Ответ 5

Ответ Jhaliya для меня был не совсем достаточным, мне нужно было сделать несколько манипуляций, чтобы заставить его работать. Мой 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;

Ответ 6

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.

Ответ 7

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

// 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;

Ответ 8

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

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

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

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

-S

Ответ 9

Swift-версия Tomasz и Jhaliya отвечает, если кто-то (иначе) борется с этим:

var cellRect = tableView.rectForRow(at: indexPath)
cellRect = cellRect.offsetBy(dx: -tableView.contentOffset.x, dy: -tableView.contentOffset.y)