Category for tracking and hiding a popover during full screen video
@implementation UIViewController (RBPopover) | |
- (void)startTrackingHidePopover { | |
[[NSNotificationCenter defaultCenter] addObserver:self | |
selector:@selector(hidePopover:) | |
name:NOTIFICATION_POPOVER_HIDE | |
object:nil]; | |
[[NSNotificationCenter defaultCenter] addObserver:self | |
selector:@selector(showPopover:) | |
name:NOTIFICATION_POPOVER_SHOW | |
object:nil]; | |
} | |
- (void)stopTrackingHidePopover { | |
[[NSNotificationCenter defaultCenter] removeObserver:self | |
name:NOTIFICATION_POPOVER_HIDE | |
object:nil]; | |
[[NSNotificationCenter defaultCenter] removeObserver:self | |
name:NOTIFICATION_POPOVER_SHOW | |
object:nil]; | |
} | |
- (void)presentPopover:(UIPopoverController *)popover fromRect:(CGRect)rect permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated { | |
self.hiddenPopoverController = popover; | |
self.hiddenPopoverPresentingRect = rect; | |
self.hiddenPopoverPresentingButton = nil; | |
self.hiddenPopoverArrowDirection = arrowDirections; | |
self.hiddenPopoverAnimated = animated; | |
if ([popover delegate]) { | |
self.hiddenPopoverDelegate = [popover delegate]; | |
} | |
[popover presentPopoverFromRect:rect inView:[self view] permittedArrowDirections:arrowDirections animated:animated]; | |
} | |
- (void)presentPopover:(UIPopoverController *)popover fromBarButtonItem:(UIBarButtonItem *)button permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated { | |
self.hiddenPopoverController = popover; | |
self.hiddenPopoverPresentingButton = button; | |
self.hiddenPopoverArrowDirection = arrowDirections; | |
self.hiddenPopoverAnimated = animated; | |
[popover presentPopoverFromBarButtonItem:button permittedArrowDirections:arrowDirections animated:animated]; | |
} | |
- (void)dismissedPopover { | |
// Don't destroy any data if we are in the middle of the hiding process | |
if (self.hiddenPopoverHidingInProgress) { | |
return; | |
} | |
self.hiddenPopoverDelegate = nil; | |
self.hiddenPopoverContent = nil; | |
self.hiddenPopoverController = nil; | |
self.hiddenPopoverPresentingButton = nil; | |
} | |
#pragma mark - Popover notifications | |
// Temporarily hide a popover | |
- (void)hidePopover:(NSNotification *)notification { | |
self.hiddenPopoverContent = nil; | |
if (self.hiddenPopoverController) { | |
// Save some details of the current state | |
// Holding on to the content view means we can go back to the same state | |
self.hiddenPopoverContent = [self.hiddenPopoverController contentViewController]; | |
self.hiddenPopoverContentSize = [self.hiddenPopoverController popoverContentSize]; | |
id <UIPopoverControllerDelegate> popoverDelegate = [self.hiddenPopoverController delegate]; | |
self.hiddenPopoverDelegate = popoverDelegate; | |
[self.hiddenPopoverController dismissPopoverAnimated:YES]; | |
self.hiddenPopoverHidingInProgress = YES; | |
if (popoverDelegate) { | |
[popoverDelegate popoverControllerDidDismissPopover:self.hiddenPopoverController]; | |
} | |
self.hiddenPopoverHidingInProgress = NO; | |
self.hiddenPopoverController = nil; | |
} | |
} | |
// Show a popover that had previously been hidden | |
- (void)showPopover:(NSNotification *)notification { | |
if (self.hiddenPopoverContent) { | |
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:self.hiddenPopoverContent]; | |
if ([popover respondsToSelector:@selector(popoverBackgroundViewClass)]) { | |
[popover setPopoverBackgroundViewClass:[ZingPopoverBackgroundView class]]; | |
} | |
CGSize popSize = self.hiddenPopoverContentSize; | |
[popover setPopoverContentSize:popSize animated:YES]; | |
[popover setDelegate:self.hiddenPopoverDelegate]; | |
if (self.hiddenPopoverPresentingButton) { | |
[popover presentPopoverFromBarButtonItem:self.hiddenPopoverPresentingButton permittedArrowDirections:self.hiddenPopoverArrowDirection animated:self.hiddenPopoverAnimated]; | |
} else { | |
[popover presentPopoverFromRect:self.hiddenPopoverPresentingRect inView:[self view] permittedArrowDirections:self.hiddenPopoverArrowDirection animated:self.hiddenPopoverAnimated]; | |
} | |
self.hiddenPopoverController = popover; | |
} | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment