Ios UIPopoverPresentationController始终显示全屏模式弹出窗口

Ios UIPopoverPresentationController始终显示全屏模式弹出窗口,ios,objective-c,iphone,uipopovercontroller,uipopover,Ios,Objective C,Iphone,Uipopovercontroller,Uipopover,我试图将视图控制器显示为按钮下方或窗口中心的UIPopoverPresentationController。但它总是显示为全窗口模式弹出窗口 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MySecondViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Pop

我试图将视图控制器显示为按钮下方或窗口中心的UIPopoverPresentationController。但它总是显示为全窗口模式弹出窗口

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    MySecondViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Pop"];

    // present the controller
    // on iPad, this will be a Popover
    // on iPhone, this will be an action sheet
    controller.modalPresentationStyle = UINavigationControllerOperationPop;
    [self presentViewController:controller animated:YES completion:nil];
    controller.preferredContentSize = CGSizeMake(280, 230);
    // configure the Popover presentation controller
    UIPopoverPresentationController *popController = [controller popoverPresentationController];
    popController.permittedArrowDirections = UIPopoverArrowDirectionUp;
    popController.delegate = self;

    // in case we don't have a bar button as reference
    popController.sourceView = self.showPop;
    popController.sourceRect = CGRectMake(384, -120, 280, 230);


-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

试试这个代码,它正在工作

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"pop"];

controller.modalPresentationStyle = UIModalPresentationPopover;
controller.preferredContentSize = CGSizeMake(280, 230);
// configure the Popover presentation controller

controller.popoverPresentationController.delegate = self;
controller.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp;


// in case we don't have a bar button as reference
controller.popoverPresentationController.sourceView = self.view;
controller.popoverPresentationController.sourceRect = CGRectMake(384, -120, 280, 230);
//    controller.presentationController.delegate = self;
[self presentViewController:controller animated:YES completion:nil];

我已经为同一个问题发布了另一个问题,我已经解决了我的问题。以下是问题的链接:

在ViewController.h中,首先创建UIPopOverpresationController的属性

@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;
然后显示PopOverPresentationcontroller

    UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];
/*Here dateVC is controller you want to show in popover*/
                dateVC.preferredContentSize = CGSizeMake(280,200);
                destNav.modalPresentationStyle = UIModalPresentationPopover;
                _dateTimePopover8 = destNav.popoverPresentationController;
                _dateTimePopover8.delegate = self;
                _dateTimePopover8.sourceView = self.view;
                _dateTimePopover8.sourceRect = [sender frame];
                destNav.modalPresentationStyle = UIModalPresentationPopover;
                destNav.navigationBarHidden = YES;
                [self presentViewController:destNav animated:YES completion:nil];
你们一定注意到了,我们展示的是视图控制器,而不是popOver。所以我们也必须以新的方式隐藏它。当我们点击屏幕时,它会自动隐藏

-(void)hideIOS8PopOver
{
    [self dismissViewControllerAnimated:YES completion:nil];
}
我们必须在实现文件中实现UIPopOverpresationController的委托。请在实现文件中写下委托方法

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

在故事板中,这很容易。只需将控件从触发操作的控件(例如UIBarButton或普通按钮)拖动到情节提要视图控制器(如果是导航控制器的根视图,则拖动到导航控制器)。 选择segue并将属性检查器中的种类更改为“以模式显示”,presentation:Form sheet(如果希望它显示在中间),选择所需的转换类型(默认为cool)


正如上面提到的@Lukas1,您应该遵循UIPopoverPresentationControllerDelegate并实现adaptivePresentationStyle方法(该方法实际上是在
UIAdaptivePresentationControllerDelegate
协议,
UIPopoverPresentationControllerDelegate
父类中定义的)并返回

以下是Swift5中的实现:

extension ViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}


“我将使用bar按钮…它会在全屏上显示tablewiew…我该怎么做…”哈桑Aftab@SurajSukale,这对你来说可能太晚了,但也许其他人可以从这个评论中受益。您应该将一个委托分配给controller.popoverPresentationController,并在委托实现方法中
adaptivePresentationStyle(for:UIPresentationController)
,返回值
UIModalPresentationStyleNone