// 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]; }こののように初期化、開く処理、閉じる処理をまとめたものを作った。