Category for tracking and hiding a popover during full screen video
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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