Учитывая UITableView
, как я могу найти местоположение конкретного UITableViewCell
? Другими словами, я хочу получить свою рамку относительно моего экрана iPhone, а не относительно UITableView
. Поэтому, если мой UITableView
прокручивается, расположение каждого UITableViewCell
должно быть выше на экране и т.д.
Получение точного местоположения UITableViewCell
Ответ 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)