in iOS8: UIPopoverController presentPopoverFromRect not work for keyWindow any more

时光毁灭记忆、已成空白 提交于 2019-12-03 02:56:23

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

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

Kabitis

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.

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];
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!