ios-UIPopoverControllerおよびUIPopoverPresentationController



Ios Uipopovercontroller



UIPopoverControllerはios9で廃止され、UIPopverPresentationControllerに置き換えられました。ここに2つの使用法の簡単な紹介があります

まず、UIPopiverControllerはNSObjectから継承されます。つまり、表示機能はありません。 contentViewControllerプロパティを持つように、コンテンツを設定する必要があります。



以下のように使用してください

- (IBAction)MenuClick:(UIBarButtonItem*)sender { ZXTableViewController * vc = [[ZXTableViewController alloc]init] //Prohibit scrolling of tableView vc.tableView.scrollEnabled=NO //Create UIPopoverController UIPopoverController * popover = [[UIPopoverController alloc]initWithContentViewController:vc] //Set the size of the pop-up view popover.popoverContentSize = CGSizeMake(375, 44*3) //Which side of the setting is displayed, Any indicates that four directions are ok, the system will help us judge [popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES] } 上記を使用する場合、最初にポップオーバーを作成するときにinitWithContentViewControllerを使用する必要があることに注意してください。そうしないと、プログラムがクラッシュし、次のエラーが報告されます。



エフェクト画像


UIPopverPresentationControllerの場合は、異なります。以下のプロキシを設定する場合、自己はプロトコルに準拠する必要があります



- (IBAction)ButtonClick:(UIButton *)sender { //Create controller ZXTableViewController * vc = [[ZXTableViewController alloc]init] //Prohibit scrolling of tableView vc.tableView.scrollEnabled=NO //Set the size, we can also set this inside the controller, let the controller decide by itself vc.preferredContentSize = CGSizeMake(300, 300) //Set style vc.modalPresentationStyle = UIModalPresentationPopover //Set the pop-up reference view, the rect parameter is based on the upper left corner of the view as the coordinate origin (0, 0) vc.popoverPresentationController.sourceView = sender //The tip of the pop-up view refers to the middle position at the bottom of the view, and specifies the rectangular frame range (position and size) of the area pointed by the arrow, with the upper left corner of the view as the origin of the coordinates vc.popoverPresentationController.sourceRect = sender.bounds //Here is to set the view that can be penetrated, that is, when the view of the controller has popped up, and there is a mask behind, we can click on a view behind it, and the view of this controller will not disappear root@xxxxx[self.AlertButton] //Set the arrow direction of the pop-up view vc.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp //Set up proxy vc.popoverPresentationController.delegate = self [self presentViewController:vc animated:YES completion:nil] } ここで、modalPresentationStyleをUIModalPresentationPopoverに設定してpopoverPresentationControllerにアクセスすると、作成されます。それ以外の場合はnilになります。

効果は以下の通りです


拡張中のより一般的に使用されるプロキシメソッド

//Click the mask popover to disappear, default YES - (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{ return YES } - (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{ NSLog(@'dismissed') } ipadでは呼び出されないが、iphoneでは呼び出される別のメソッドがあります//The default pop-up covers the entire screen -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{ return UIModalPresentationNone }

iPhoneでは、上記のメソッドがUIModalPresentationNoneを返すと、画面いっぱいに表示されます。レンダリングは次のようになります。

iPhoneで上記の表示効果が必要な場合は、ボタンを追加して、このボタンで閉じる操作を実行することもできます。次に、メソッドを書き直す必要があります

-(UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle: (UIModalPresentationStyle)style { UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:controller .presentedViewController] UIBarButtonItem * item = [[UIBarButtonItem alloc]initWithTitle:@'complete' style: UIBarButtonItemStyleDone target:self action: @selector(complete)] navigationController.topViewController.navigationItem.rightBarButtonItem = item return navigationController } -(void)complete { [self dismissViewControllerAnimated:YES completion:nil] }