我知道SDK文档说
弹出窗口内容之外的点击会自动关闭弹出窗口。
但我相信这里的聪明人找到了方法:) 也许我应该覆盖popover dismiss函数?
由于
编辑: 我尝试使用passthroughViews,这是建议的,它完美地工作。以下是需要它的人的代码 - 在这个例子中,我将self.view放在数组中,这意味着在弹出窗口的按钮之外的地方,没有任何东西可以解除弹出窗口。
popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease];
答案 0 :(得分:12)
您需要设置passthroughViews
属性。来自文档:
当弹出窗口可见时,用户可以与之交互的视图数组。
@property (nonatomic, copy) NSArray *passthroughViews
当弹出窗口处于活动状态时,通常会禁用与其他视图的交互,直到弹出窗口被取消。为此属性分配视图数组允许弹出窗口外的点击由相应的视图处理。
将passthroughViews
设置为您要处理触摸事件的视图数组,而不是仅仅解除弹出窗口。
答案 1 :(得分:7)
接受的答案并没有真正回答这个问题,“有什么方法可以在外面按下弹出器时不被解雇?”,imo。它确实提供了一个可能的视图,但可能需要对所有父视图进行hackish访问并确定屏幕上的视图等。问题可以改为“我如何制作一个popover视图模式?”
您可以这样做,使用完成按钮关闭弹出窗口:
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方法中解雇popover。其他考虑因素是解雇和重新显示设备方向更改,但我会将其留给另一个练习,因为之前已经在stackoverflow上回答过。
答案 2 :(得分:7)
有一个非常简单而合法的解决方案。在显示UIPopoverController
的视图控制器中,符合UIPopoverControllerDelegate
协议并实现以下委托方法。我刚测试了这个,它确实阻止了弹出消除。
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
return NO;
}
只需确保已将弹出控制器的委托设置为实现此目的的视图控制器。
您可以使用[popoverController dismissPopoverAnimated:NO];
方法解除弹出窗口。