2011-12-27 1 views
3

У меня есть popover, который представлен от другого popover. Оба они имеют tableView. Второй поппер для первой строки отлично, стрелка указывает на середину ячейки. Но другие указывают на верхней части камеры, а стрелка находится в верхней части пирог, а не в середине ...Popover from tableViewCell positioning issue

То, как я построить поповер

- (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

ответ

2

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

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

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

+0

Каким образом вы в конечном счете используете? – fatuhoku

1

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

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

редактирования: фиксированный код для отражения фактического решения

+0

'rectForRowAtIndexPath' возвращает прямоугольник для строки, которая находится на indexPath, поэтому вам нужно« кормить »ее с помощью indexPath как параметра, а не строки ... – Faser

1

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

4

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

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

CGRect rectInTableView = [myTableView rectForRowAtIndexPath:someIndexPath]; 

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

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

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

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

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

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

Смежные вопросы