Popover из таблицы позиционирования проблема с ячейкой - PullRequest
3 голосов
/ 27 декабря 2011

У меня есть поповер, который представлен из другого поповера. У них обоих есть tableViews. Второй поповер для первого ряда в порядке, стрелка указывает на середину ячейки. Но остальные указывают на вершину ячейки, а стрелка находится наверху поповера, а не посередине…

Вот как я создаю поповер

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{

self.editController = [[TitleViewController alloc] init];
[self.editController setSizeWithWidth:self.view.bounds.size.width AndHeight:140.0];
self.editController.directoryString = [directoryPath stringByAppendingPathComponent:[self.tableView cellForRowAtIndexPath:indexPath].textLabel.text];

self.editPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.editController];



CGRect aFrame = [self.tableView rectForRowAtIndexPath:indexPath];

[self.editPopoverController presentPopoverFromRect:aFrame inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

} Here is the misplaced second popover

EDIT

ЕСЛИ я изменяю направление стрелки на Any, это выглядит следующим образом.

Снова к ArrowDirection = Left

Если я внесу изменения, которые были рекомендованы (обратите внимание, что aFrame.size.height * 2, а не делится на два), стрелка указывает на середину ячейки, но все еще неудобно располагается в новом кадре всплывающего окна (не в середине)

enter image description here

Ответы [ 4 ]

4 голосов
/ 05 января 2012

Я действительно столкнулся с такой же проблемой при попытке расширить ячейку до полного размера tableView.Запрашивать рамку ячейки и использовать ее вне табличного представления не так просто, как я думал.Тем не менее, я нашел решение после некоторых прямых вопросов на г-на.Google.

Этот первый метод фактически дает кадр ячейки с точки зрения tableView.

CGRect rectInTableView = [myTableView rectForRowAtIndexPath:someIndexPath];

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

Этот второй метод преобразует этот прямоугольник в перспективу вида, в котором вы хотите разместить всплывающее окно.В моем случае [myTableView superView], но это может быть любой видимый вид.

CGRect rectInSuperview = [myTableView convertRect:rectInTableView toView:someView];

Этот rectInSuperView, вероятно, то, что вы ищете.Это решило многие мои проблемы с cellFrame, и это также может помочь вам.

Стрелка всегда будет указывать на середину прямоугольника, поэтому, если ваш прямоугольник не работает нормально, «взломав» прямоугольник, чтобы сделатьэто не самый лучший способ решить эту проблему.

Надеюсь, это решение подойдет и вам.И если не стесняйтесь, оставьте комментарий, и я посмотрю, смогу ли я помочь вам в дальнейшем.

2 голосов
/ 05 января 2012

Я думаю, что есть 2 возможных решения этой проблемы:

  1. Измените значение height aFrame на aFrame.size.height / 2
  2. Измените presentPopoverFromRect:inView:permittedArrowDirections:animated :,и убедитесь, что TableViewCell's contentView установлен в качестве параметра inView.

Надеюсь, это поможет.

1 голос
/ 05 января 2012

не могу понять, почему это происходит, но вы также можете добавить (cell.frame.height / 2) в frame.y поповера и исправить это:)

1 голос
/ 30 декабря 2011

Вам нужно определить, что в строке вызывает popover.Когда вы это сделали, попробуйте заменить CGRect aFrame = [self.tableView rectForRowAtIndexPath:indexPath]; на

CGRect aFrame = [self.tableView rectForRowAtIndexPath:indexPath];

edit: исправлен код, отражающий фактическое решение

...