en iOS8: UIPopoverController presentPopoverFromRect ya no funciona para keyWindow
(4)
Cambiar el parámetro inView en
[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
a
[testPopoverController presentPopoverFromRect:rect inView:"your current View Controller''s view" permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
Y asegúrate de que esté en bloque de despacho.
dispatch_async(dispatch_get_main_queue(), ^{
});
También cambia el kip cambiando los valores de tamaño de origen y origen si está dentro de los límites
Como se titula, en iOS8, [UIPopoverController presentPopoverFromRect] ya no funciona para [UIApplication sharedApplication] .keyWindow. (Funciona en iOS7)
Verifiqué los siguientes códigos:
TestViewController *test = [[TestViewController alloc] initWithNibName:nil bundle:nil];
if (testPopoverController == nil) {
testPopoverController = [[UIPopoverController alloc] initWithContentViewController:test];
testPopoverController.popoverContentSize = CGSizeMake(250, 95*5);
}
CGPoint point = [sender convertPoint:CGPointMake(0, 0) toView:nil];
CGRect rect = CGRectMake(point.x, point.y, 24, 24);
[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
Creo que tienes que mostrarlo en vista completa / controlador de vista y no en [UIApplication sharedApplication] .keyWindow
Así que cambia este código:
[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
a:
[testPopoverController presentPopoverFromRect:rect inView:aViewControllerInYourApp permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
La mejor solución que he encontrado es manejarlo condicionalmente. Si está en iOS 7, use el código de trabajo que teníamos para presentar un UIPopoverController en la ventana clave. Si está en iOS 8, use lo siguiente:
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];
Esto termina funcionando de manera idéntica a:
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];
Pruebe la solución que se encuentra en este enlace: http://github.com/werner77/WEPopover
Primero, hagamos este código:
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];
Espero que esto ayude. Fue probado y funciona para iOS6-iOS8.
PD. No olvide revisar viewDidLoad
y agradecer a la Biblioteca de WEPopover.