Как вызвать PopOver Controller из UITableViewCell.accessoryView? - PullRequest
3 голосов
/ 13 мая 2010

Во-первых, я хотел бы сказать, что я действительно новичок в разработке для ipad / ipod / iphone, а также в target-c.

С учетом вышесказанного я пытаюсь разработать небольшое приложение для iPad, используя Xcode и IB, в основном у меня есть таблица, для каждого UITableViewCell в таблице я добавил в accessoryView кнопку, содержащую изображение.

Вот код:

UIImage *img = [UIImage imageNamed:@"myimage.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake(0.0, 0.0, img.size.width, img.size.height);
button.frame = frame;   // match the button's size with the image size

[button setBackgroundImage:img forState:UIControlStateNormal];

// set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;

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

Я пробовал это на «accessoryButtonTappedForRowWithIndexPath» tableView:

UITableViewCell *cell = [myTable cellForRowAtIndexPath:indexPath];
UIButton *button = (UIButton *)cell.accessoryView;

//customViewController is the controller of the view that I want to be displayed by the PopOver controller
customViewController = [[CustomViewController alloc]init];

popOverController = [[UIPopoverController alloc]
initWithContentViewController: customViewController];

popOverController.popoverContentSize = CGSizeMake(147, 122);

CGRect rect = button.frame;

[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

Проблема с этим кодом в том, что он показывает Popover в верхней части представления приложения, при отладке я видел значения «rect», и они:

x = 267
y = 13

поэтому я думаю, что совершенно очевидно, почему PopOver отображается так высоко в представлении, поэтому мой вопрос, как я могу получить правильные значения для PopOver, которые будут отображаться чуть ниже кнопки на accessoryView ячейки?

Кроме того, как вы можете видеть, я говорю ему использовать "cell.accessoryView" для атрибута "inView:", это нормально?

Ответы [ 3 ]

8 голосов
/ 13 мая 2010

Попробуйте использовать button.bounds вместо button.frame, поскольку прямоугольник относительно inView.

Также обратите внимание, что если ячейка находится в нижней части экрана, всплывающее окно может не отображаться в нужном размере, поскольку вы нажимаете стрелку в направлении вверх. Вы должны либо обработать это вручную, либо просто использовать Any.

1 голос
/ 14 июля 2015

вот для быстрого:

let cell = tableView.cellForRowAtIndexPath(indexPath)
let rect = tableView.convertRect(tableView.rectForRowAtIndexPath(indexPath), toView: tableView)


    var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("loadZone") as! UIViewController
    var nav = UINavigationController(rootViewController: popoverContent)

    nav.modalPresentationStyle = UIModalPresentationStyle.Popover

    var popover = nav.popoverPresentationController

    popoverContent.preferredContentSize = CGSizeMake(100,200)
    popover!.sourceView = tableView
    popover!.sourceRect = rect

    self.presentViewController(nav, animated: true, completion: nil)

enter image description here

1 голос
/ 14 июля 2011
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

Изменение inView: cell.accessoryView на inView: cell

...