// Popoverの初期化
-(UIPopoverController *)uipopoverViewInit:(UIViewController *)mainView addView:(UIView *)addView sourceView:(UIBarButtonItem *)sourceView
{
UIPopoverController *popoverView;
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
CGSize screenSize = [[self mainScreen] bounds].size;
UIView *backView = [[UIView alloc] init];
backView.frame = mainView.view.bounds;
backView.backgroundColor = [UIColor blackColor];
backView.alpha = 0.3;
backView.hidden = YES;
[mainView.view addSubview:backView];
[mainView.view addSubview:addView];
addView.center = CGPointMake(screenSize.width/2, (screenSize.height/2)-30);
mainView.modalPresentationStyle = UIModalPresentationOverFullScreen;
UIPopoverPresentationController *popPC = mainView.popoverPresentationController;
popPC.barButtonItem = sourceView;
popPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
popoverView = nil;
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
mainView.view = [addView initWithFrame:addView.bounds];
mainView.contentSizeForViewInPopover = addView.bounds.size;
popoverView = [[UIPopoverController alloc]initWithContentViewController:mainView];
}
addView.hidden = YES;
return popoverView;
}
// Popoverのを開く
-(void)uipopoverViewOpen:(UIViewController *)openView sourceView:(UIView *)sourceView popoverView:(UIPopoverController *)popoverView controller:(id)controller
{
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
UIView* backView = [openView.view.subviews objectAtIndex:0];
backView.hidden = NO;
backView.alpha = 0.3;
[controller presentViewController:openView animated:NO completion:nil];
// 背景をタッチしたら、Popoverを隠す
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: controller action:@selector(closePopoverView:)];
[backView addGestureRecognizer:gestureRecognizer];
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
[popoverView presentPopoverFromRect:CGRectMake(sourceView.frame.origin.x + (sourceView.frame.size.width / 2),
sourceView.frame.origin.y + (sourceView.frame.size.height / 2), 0, 0)
inView:controller.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
}
// Popoverのを閉じる
-(void)uipopoverViewClose:(UIViewController *)closeView popoverView:(UIPopoverController *)popoverView
{
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
UIView* backView = [closeView.view.subviews objectAtIndex:0];
backView.hidden = YES;
[closeView dismissViewControllerAnimated:NO completion:nil];
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
[popoverView dismissPopoverAnimated:NO];
}
}
-(void)closePopoverView:(id)sender
{
// Popoverを閉じる
[self uipopoverViewClose:closeView popoverView:nil];
}
こののように初期化、開く処理、閉じる処理をまとめたものを作った。