UIPopoverPresentationController всегда показывает полноэкранное модальное всплывающее окно

Я пытаюсь показать контроллер представления как 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;
}

person Muhammad Umair    schedule 28.03.2016    source источник


Ответы (4)


Попробуйте этот код, он работает

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];
person Hassan Aftab    schedule 28.03.2016
comment
я собираюсь использовать кнопку панели... она показывает мне таблицу в полноэкранном режиме... что мне делать... @Hassan Aftab - person Suraj Sukale; 02.06.2016
comment
@SurajSukale, возможно, для вас уже слишком поздно, но, возможно, кому-то еще будет полезен этот комментарий. Вы должны назначить делегата для controller.popoverPresentationController и в делегате реализовать метод adaptivePresentationStyle(for: UIPresentationController), возвращая значение UIModalPresentationStyleNone - person Lukas1; 03.07.2017

Я разместил еще один вопрос по тому же вопросу, и я решил свою проблему. Вот ссылка на вопрос: UIPopoverPresentationController показывает полноэкранный режим на iPhone< /а>

В ViewController.h сначала создайте свойство UIPopoverPresenatationController.

@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;

Затем, чтобы показать контроллер PopOverPresentation

    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];

Вы, должно быть, заметили, что мы представляем View Controller вместо popOver. Поэтому мы также должны скрыть это по-новому. Он скрывается автоматически, когда мы нажимаем на экран.

-(void)hideIOS8PopOver
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

Мы должны реализовать делегат UIPopoverPresenatationController в файле реализации. Напишите ниже метод делегата в файле реализации.

- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}
person Muhammad Umair    schedule 28.03.2016

В раскадровке это очень просто. Просто управляйте перетаскиванием из элемента управления, который запускает действие (например, UIBarButton или обычная кнопка), в контроллер представления раскадровки (если корневой вид контроллера навигации, перетащите в контроллер навигации). Выберите переход и измените тип в инспекторе атрибутов на «Представить модально», презентация: лист формы (если вы хотите, чтобы он отображался в центре), выберите нужный тип перехода (по умолчанию круто).

Снимок экрана инспектора атрибутов

person Oluwatobi Omotayo    schedule 29.09.2016

Как упоминалось выше @Lukas1, вы должны соответствовать UIPopoverPresentationControllerDelegate и реализовать метод адаптивногоPresentationStyle (который фактически определен в протоколе UIAdaptivePresentationControllerDelegate, родительском классе UIPopoverPresentationControllerDelegate) и вернуть .none И вот реализация в Swift5:

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

person Alex L    schedule 20.05.2019