UIPopoverPresentationController на iOS 8 iPhone
кто-нибудь знает, если UIPopoverPresentationController может использоваться для представления всплывающих окон на iPhone? Интересно, если Apple добавила эту функцию на iOS 8 в их попытке создать более унифицированные контроллеры презентации для iPad и iPhone.
Не уверен, что это нормально, чтобы задать / ответить на вопросы из бета-версии. Я удалю его в таком случае.
7 ответов:
вы можете переопределить адаптивное поведение по умолчанию (
UIModalPresentationFullScreenв компактной горизонтальной среде, т. е. iPhone) с помощьюadaptivePresentationStyleForPresentationController:способ доступен черезUIPopoverPresentationController.delegate.
UIPresentationControllerиспользует этот метод, чтобы задать новый стиль презентации, что, в вашем случае, просто вернувUIModalPresentationNoneвызываетUIPopoverPresentationControllerдля отображения в виде всплывающего окна вместо полноэкранного режима.вот пример popover с использованием настройки segue в раскадровке из
UIBarButtonItemна "присутствует модально" аUIViewControllerclass SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate { // override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { // swift < 3.0 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "PopoverSegue" { if let controller = segue.destinationViewController as? UIViewController { controller.popoverPresentationController.delegate = self controller.preferredContentSize = CGSize(width: 320, height: 186) } } } // MARK: UIPopoverPresentationControllerDelegate //func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // swift < 3.0 func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { // Return no adaptive presentation style, use default presentation behaviour return .None } }этот трюк был упомянут в WWDC 2014 сессия 214 "просмотр контроллера продвижение в iOS8" (36:30)
если кто-то хочет представить всплывающем окне с кодом, вы можете использовать следующий подход.
С
объявить собственность
UIPopoverPresentationController:@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;используйте следующий метод, чтобы представить popover из UIButton:
- (IBAction)btnSelectDatePressed:(id)sender { 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.navigationBarHidden = YES; [self presentViewController:destNav animated:YES completion:nil]; }используйте следующий метод для представления popover из UIBarButtonItem:
- (IBAction)btnSelectDatePressed:(id)sender { 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; CGRect frame = [[sender valueForKey:@"view"] frame]; frame.origin.y = frame.origin.y+20; _dateTimePopover8.sourceRect = frame; destNav.navigationBarHidden = YES; [self presentViewController:destNav animated:YES completion:nil]; }реализовать этот метод делегата тоже на ваш взгляд контроллер:
- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller { return UIModalPresentationNone; }, чтобы закрыть диалоговое окно, просто уволить контроллера представления. Ниже приведен код для отключения контроллера вида:
-(void)hideIOS8PopOver { [self dismissViewControllerAnimated:YES completion:nil]; }Свифт
используйте следующий метод, чтобы представить popover из UIButon:
func filterBooks(sender: UIButon) { let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil) var filterDistanceViewController = UINavigationController(rootViewController: filterVC) filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205) let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController popoverPresentationViewController?.permittedArrowDirections = .Any popoverPresentationViewController?.delegate = self popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem popoverPresentationViewController!.sourceView = self.view; popoverPresentationViewController!.sourceRect = sender.frame filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover filterDistanceViewController.navigationBarHidden = true self.presentViewController(filterDistanceViewController, animated: true, completion: nil) }используйте следующий метод для представления popover из UIBarButtonItem:
func filterBooks(sender: UIBarButtonItem) { let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil) var filterDistanceViewController = UINavigationController(rootViewController: filterVC) filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205) let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController popoverPresentationViewController?.permittedArrowDirections = .Any popoverPresentationViewController?.delegate = self popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem popoverPresentationViewController!.sourceView = self.view; var frame:CGRect = sender.valueForKey("view")!.frame frame.origin.y = frame.origin.y+20 popoverPresentationViewController!.sourceRect = frame filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover filterDistanceViewController.navigationBarHidden = true self.presentViewController(filterDistanceViewController, animated: true, completion: nil) }реализовать этот метод делегата тоже на ваш взгляд контроллер:
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{ return .None }пожалуйста, не забудьте добавить делегат
UIPopoverPresentationControllerDelegatein .ч./м./swift file
: iPhone popover отображает полноэкранный режим и не уважает значение preferredContentSize.
устранение: вопреки тому, что Apple предлагает в ссылке на класс UIPopoverPresentationController, представляя контроллер представления после получение ссылки на контроллер презентации popover и его настройка.
// Get the popover presentation controller and configure it. //... // Present the view controller using the popover style. [self presentViewController:myPopoverViewController animated: YES completion: nil];
Я нашел обходной путь.
на Xcode6. 1, Используйте
presentationController.delegateвместоpopoverPresentationController.delegate.- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier compare:@"showPopOver"] == NSOrderedSame) { UINavigationController * nvc = segue.destinationViewController; UIPresentationController * pc = nvc.presentationController; pc.delegate = self; } } #pragma mark == UIPopoverPresentationControllerDelegate == - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }в WWDC 2014 "просмотр контроллер достижения в iOS8", ниже коды могут показать popover на iPhone.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UINavigationController * nvc = segue.destinationViewController; UIPopoverPresentationController * pvc = nvc.popoverPresentationController; pvc.delegate = self; } #pragma mark == UIPopoverPresentationControllerDelegate == - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }но на Xcode 6.1 эти коды показывают полноэкранное представление... (nvc.popoverPresentationController равен нулю)
Я сомневаюсь, что это может быть это.
убедитесь, что для реализации UIAdaptivePresentationControllerdelegate
такой:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }Если вы не хотите полноэкранные всплывающие окна
В iOS 8.3 и более поздних, используйте следующий синтаксис
UIPopoverPresentationControllerDelegateпротокол для переопределения всплывающего окнаUIModalPresentationStyle.func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none }
добавьте эти два метода в свой класс WEBVIEW. и добавить
-(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender { // Assuming you've hooked this all up in a Storyboard with a popover presentation style if ([segue.identifier isEqualToString: @"showPopover"]) { UINavigationController * destNav = segue.destinationViewController; pop = destNav.viewControllers.firstObject; // This is the important part UIPopoverPresentationController * popPC = destNav.popoverPresentationController; popPC.delegate = self; } } - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller { return UIModalPresentationNone; }
Comments