in iOS8: UIPopoverController presentPopoverFromRect not work for keyWindow any more

后端 未结 4 1536
臣服心动
臣服心动 2021-02-05 12:03

As titled, in iOS8, [UIPopoverController presentPopoverFromRect] does not work for [UIApplication sharedApplication].keyWindow any more. (It does work in iOS7)

I verifi

相关标签:
4条回答
  • 2021-02-05 12:32

    Try the solution found at this link: http://github.com/werner77/WEPopover

    1st, let's do this code:

    if ([viewController respondsToSelector:@selector(setPreferredContentSize:)]) {
        viewController.preferredContentSize = CGSizeMake(200, 300.0f);
    } else {
        viewController.contentSizeForViewInPopover = CGSizeMake(200.0f, 300.0f);
    }
    
    self.popoverController = [[popoverClass alloc] initWithContentViewController:viewController];
    
    if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) {
        [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]];
    }
    
    self.popoverController.delegate = self;
    
    [self.popoverController presentPopoverFromRect:[sender bounds]
          inView:sender
          permittedArrowDirections:UIPopoverArrowDirectionUp
          animated:YES];
    

    I hope this helps. It was tested and works for iOS6-iOS8.

    PS. Don't forget to check viewDidLoad, and give thanks to the WEPopover Library.

    0 讨论(0)
  • 2021-02-05 12:33

    Change the inView parameter in

    [testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    

    to

    [testPopoverController presentPopoverFromRect:rect inView:"your current View Controller's view" permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    

    And make sure it is in dispatch block

      dispatch_async(dispatch_get_main_queue(), ^{
    

    });

    Also kip changing your rect origin n size values if it is within the bounds

    0 讨论(0)
  • 2021-02-05 12:33

    I think you have to display it in full view/viewcontroller and not in [UIApplication sharedApplication].keyWindow

    So change this code:

    [testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    

    to:

    [testPopoverController presentPopoverFromRect:rect inView:aViewControllerInYourApp permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    
    0 讨论(0)
  • 2021-02-05 12:49

    The best solution I've come up with is to handle it conditionally. If on iOS 7, use the working code we had for presenting a UIPopoverController on the key window. If on iOS 8, use the following:

         viewController.modalPresentationStyle = UIModalPresentationPopover;
         UIPopoverPresentationController *presentationController = viewController.popoverPresentationController;
         [presentationController setDelegate:self];
         presentationController.permittedArrowDirections = 0;
         presentationController.sourceView = [[UIApplication sharedApplication] keyWindow];
         presentationController.sourceRect = [[UIApplication sharedApplication] keyWindow].bounds;
    
         [viewController setPreferredContentSize:CGSizeMake(320, 480)];
         [parentController presentViewController:viewController animated:YES completion:nil];
    

    This ends up functioning identically to:

         self.popoverController = [[UIPopoverController alloc] initWithContentViewController:viewController];
         [self.popoverController setDelegate:self];
         [self.popoverController setPopoverContentSize:isLandscape() ? CGSizeMake(480*2, 320*2) : CGSizeMake(320*2, 480*2)];
         [self.padPopover presentPopoverFromRect:CGSizeMake(320, 480)
                                          inView:[[UIApplication sharedApplication] keyWindow]
                        permittedArrowDirections:0
                                        animated:YES];
    
    0 讨论(0)
提交回复
热议问题