В iOS8: UIPopoverController presentPopoverFromRect больше не работает для keyWindow
Как указано, в iOS8 [UIPopoverController presentPopoverFromRect] больше не работает для [UIApplication sharedApplication].keyWindow. (Он работает в iOS7)
Я проверил следующие коды:
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];
Ответы
Ответ 1
Лучшим решением, которое я придумал, является его условное разрешение. Если на iOS 7, используйте действующий код для представления UIPopoverController в окне ключа. Если на iOS 8 используйте следующее:
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];
В результате он функционирует идентично:
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];
Ответ 2
Измените параметр inView в
[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
к
[testPopoverController presentPopoverFromRect:rect inView:"your current View Controller view" permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
И убедитесь, что он находится в блоке отправки
dispatch_async(dispatch_get_main_queue(), ^{
});
Также kip меняет ваши значения размера n прямоугольного начала, если он находится в пределах границ
Ответ 3
Попробуйте найти решение по этой ссылке: http://github.com/werner77/WEPopover
1, сделайте этот код:
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];
Надеюсь, это поможет. Он был протестирован и работает для iOS6-iOS8.
PS. Не забудьте проверить viewDidLoad
и поблагодарить библиотеку WEPopover.
Ответ 4
Я думаю, что вы должны отображать его в полноэкранном /viewcontroller, а не в [UIApplication sharedApplication].keyWindow
Итак, измените этот код:
[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
в
[testPopoverController presentPopoverFromRect:rect inView:aViewControllerInYourApp permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];