我尝试使用Xcode(版本9.1 9B55)Master-Detail模板,使用一个Storyboard同时支持iPhone和iPad。
我想使用内置的popover segue,理想情况下,当尺寸类合适时会显示一个弹出框,或者当尺寸类是紧凑的时候是模态视图控制器(iPhone中的纵向)。
我发现它对iPad来说效果很好,但是当我在iPhone上运行它时,你不能像我期望的那样在popover外面触摸它。
在iPad上,调用popoverPresentationControllerDidDismissPopover并且一切正常。
在iPhone上,popoverPresentationControllerDidDismissPopover永远不会被调用,你无法解除popover。
为了重现,我这样做了:
创建新的Master-Detail App
新文件。 Cocoa Touch Class,名为MyPopoverViewController
在故事板中:
创建新的视图控制器,将类更改为MyPopoverViewController。
在MasterViewController上,添加栏按钮项" Popover"。按住Ctrl键并从中拖动到MyPopoverViewController。将segue Kind设置为" Present as Popover"。将标识符设置为" thePopover"。
在MasterViewController.h中,添加UIPopoverPresentationControllerDelegate:
@interface MasterViewController : UITableViewController <UIPopoverPresentationControllerDelegate>
在MasterViewController.m中:
#import "MyPopoverViewController.h"
在viewDidLoad中,注释掉两行创建&#34;添加按钮&#34;。
在prepareForSegue中:
} else if ([[segue identifier] isEqualToString:@"thePopover"]) {
NSLog(@"MVC prepareForSegue thePopover");
MyPopoverViewController *myPopoverController = segue.destinationViewController;
myPopoverController.popoverPresentationController.delegate = self;
}
添加三个UIPopoverPresentationControllerDelegate委托方法:
- (void) prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController {
NSLog(@"MVC prepareForPopoverPresentation");
}
- (void) popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
NSLog(@"MVC popoverPresentationControllerDidDismissPopover");
}
- (BOOL) popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController {
NSLog(@"MVC popoverPresentationControllerShouldDismissPopover");
return TRUE;
}
我也尝试了这一点,但它所做的只是在纵向模式下强制弹出(我不想要);并没有改变popover代表电话的缺乏,也不允许我们解雇popover:
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}
我希望这里有一些简单的东西。我在这里上传了一个示例项目,这正是我上面所描述的:
https://github.com/johnstewart/MasterDetailPopoverTestProject
如何通过触摸popover外部来允许iPhone同时解除弹出窗口?
答案 0 :(得分:1)
如果我正确理解您的问题,您的问题将出现在横向模式的iPhone 8 Plus上。
在这种情况下,呈现的弹出窗口实际上是不一个弹出框,而是一个正常的呈现视图。从视觉上看,它看起来像是从屏幕底部出现的一张纸。要关闭此类视图,您必须添加自己的按钮才能执行此操作。
如果要显示真实的弹出框,则必须实现:
adaptivePresentationStyleForPresentationController:traitCollection:
返回UIModalPresentationNone
。请注意附加参数traitcollection:
。 UIAdaptivePresentationControllerDelegate
包含两个类似的方法。在您的项目中,您已经实现了该方法:
adaptivePresentationStyleForPresentationController:
将此更改为前一种方法,一切都应该有效。