Есть ли способ, чтобы не выбрасывать поповер при нажатии снаружи? - PullRequest
8 голосов
/ 29 марта 2011

Я знаю, что в документации SDK написано

При нажатии за пределы содержимого всплывающего окна оно автоматически закрывается.

Но я уверен, что умные люди здесь нашли способ :) может быть, мне следует переписать функцию отклонения popover?

Спасибо

EDIT: Я попытался использовать passthroughViews, как было предложено здесь, и он отлично работает. Вот код для тех, кому это нужно - в этом примере я поместил self.view в массив, что означает, что когда бы ни находился за пределами кнопки, где появился поповер, ничто не отклоняет поповер.

        popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease];

Ответы [ 3 ]

12 голосов
/ 29 марта 2011

Вам необходимо установить свойство passthroughViews. Из документации:

Массив представлений, с которыми пользователь может взаимодействовать, пока отображается всплывающее окно.

@property (nonatomic, copy) NSArray *passthroughViews

Когда всплывающее окно активно, взаимодействия с другими представлениями обычно отключаются, пока всплывающее окно не будет отклонено. Присвоение массива представлений этому свойству позволяет обрабатывать касания вне всплывающего окна соответствующими представлениями.

Установите passthroughViews для массива представлений, которые вы хотите обработать сенсорным событием, вместо того, чтобы просто отклонить всплывающее окно.

7 голосов
/ 15 августа 2013

Существует очень простое и законное решение. В контроллере представления, который представляет ваш UIPopoverController, соответствует протоколу UIPopoverControllerDelegate и реализуйте следующий метод делегата. Я только что проверил это, и это не позволяет поповеру уволить.

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
    return NO;
}

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

Вы можете отклонить всплывающее окно, используя метод [popoverController dismissPopoverAnimated:NO];.

7 голосов
/ 14 октября 2011

Принятый ответ на самом деле не отвечает на вопрос, "есть ли способ, чтобы НЕ закрывать поповер при нажатии за его пределами?"Это дает возможное представление, но может потребовать хакерского доступа ко всем родительским представлениям и определения того, какие представления отображаются на экране и т. Д. Вопрос можно перефразировать следующим образом: «Как сделать модальное представление для поповера?»

Высделал бы это так, с помощью кнопки «Готово», чтобы закрыть поповер:

UIViewController* vc = [[[UIViewController alloc] init] autorelease];

UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"] style:UIBarButtonItemStyleDone target:self action:@selector(processDoneAction)] autorelease];

[vc.navigationItem setLeftBarButtonItem:doneButton];

vc.modalInPopover = YES;
//If you want full screen:
vc.modalPresentationStyle = UIModalPresentationFullScreen;
vc.wantsFullScreenLayout = YES;

UINavigationController* navC = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];

UIView* view = create your view

vc.view = view;

UIPopoverController* pc = [[[UIPopoverController alloc] initWithContentViewController:navC] autorelease];
pc.delegate = self;
self.popoverController = pc;

Тогда в вашем методе processDoneAction вам нужно будет закрыть поповер.Другими соображениями было бы отклонение и повторное отображение изменений ориентации устройства, но я оставлю это другому упражнению, так как на него ранее был дан ответ на stackoverflow.

...