As titled, in iOS8, [UIPopoverController presentPopoverFromRect] does not work for [UIApplication sharedApplication].keyWindow any more. (It does work in iOS7)
I verifi
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.
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
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];
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];