From 5bbacf4de123e28f9493deba226c897e383f132b Mon Sep 17 00:00:00 2001 From: Scott Pfeil Date: Fri, 11 Mar 2022 15:28:21 -0500 Subject: [PATCH] Move status bar to the split view for control. Each page can style status bar now, not just top alerts. --- ...MCoreUISplitViewController+Extension.swift | 24 +++ .../MVMCoreUISplitViewController.h | 18 +- .../MVMCoreUISplitViewController.m | 82 +++++---- .../TopAlert/MVMCoreTopAlertViewProtocol.h | 9 +- .../MVMCoreUITopAlertView+Extension.swift | 2 +- MVMCoreUI/TopAlert/MVMCoreUITopAlertView.h | 15 -- MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m | 164 ++++++------------ 7 files changed, 149 insertions(+), 165 deletions(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index a4bbcb08..58bb1497 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit // Navigation bar update functions public extension MVMCoreUISplitViewController { @@ -122,6 +123,29 @@ public extension MVMCoreUISplitViewController { navigationController.isDisplayed(viewController: viewController), let model = navigationController.getNavigationModel(from: viewController) else { return } set(for: viewController, navigationController: navigationController, navigationItemModel: model) + guard !(topAlertView?.overridingStatusBar() ?? false) else { return } + setStatusBarForCurrentViewController() + } + + /// Returns the bar style for the background color. Light if on a dark background, otherwise default. + func getStatusBarStyle(for backgroundColor: UIColor?) -> UIStatusBarStyle { + var greyScale: CGFloat = 0 + if backgroundColor?.getWhite(&greyScale, alpha: nil) == true, + greyScale < 0.5 { return .lightContent } + return .default + } + + /// Updates the status bar background color and style. + @objc func setStatusBarForCurrentViewController() { + let viewController = getCurrentViewController() as? MVMCoreUIDetailViewProtocol + let backgroundColor = viewController?.defaultStatusBarBackgroundColor?() ?? + navigationController?.navigationBar.standardAppearance.backgroundColor ?? + statusBarView?.backgroundColor + + let style = viewController?.defaultStatusBarStyle?() ?? + getStatusBarStyle(for: backgroundColor) + + setStatusBarBackgroundColor(backgroundColor, style: style) } } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h index 9c07374d..db5e9cd9 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h @@ -44,6 +44,9 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { // Reference to the top alert view @property (nullable, weak, nonatomic) MVMCoreUITopAlertView *topAlertView; +// Reference to the status bar view +@property (nullable, weak, nonatomic) UIView *statusBarView; + // References to the current navigation item settings. @property (nonatomic, readonly) BOOL leftPanelIsAccessible; @property (nonatomic, readonly) BOOL rightPanelIsAccessible; @@ -122,10 +125,6 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { + (CGFloat)getApplicationViewWidth; + (CGFloat)getApplicationViewMaxSize; -// return subviewcontrollers' prefer status bar style -- (UIStatusBarStyle)getDefaultStatusBarStyle; -- (nullable UIColor *)getDefaultStatusBarBackgroundColor; - /// Returns true if a panel is showing. - (BOOL)isAPanelShowing; @@ -166,4 +165,15 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { /// Updates if the tab bar is showing or not. - (void)updateTabBarShowing:(BOOL)showing; +#pragma mark - Status Bar + +/// Updates the status bar with the given style and background color +- (void)setStatusBarBackgroundColor:(nullable UIColor *)backgroundColor style:(UIStatusBarStyle)style; + +/// Shows the view under the status bar. +- (void)expandStatusBarView; + +/// Hides the view under the status bar. +- (void)collapseStatusBarView; + @end diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index e16daa56..5c337072 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -63,6 +63,10 @@ typedef NS_OPTIONS(NSInteger, MFExtendedDrawer) { @property (weak, nonatomic, readwrite) UIViewController *navigationItemViewController; @property (strong, nonatomic) NSNumber *transitionWidth; +@property (nonatomic) UIStatusBarStyle statusBarStyle; +@property (strong, nonatomic) NSLayoutConstraint *statusBarHeightConstraint; +@property (strong, nonatomic) NSLayoutConstraint *statusBarBottomConstraint; + // Dismisses any panel - (void)dismissPanels:(id)sender; @@ -841,6 +845,38 @@ CGFloat const PanelAnimationDuration = 0.2; }]; } +#pragma mark - Status Bar + +- (void)setStatusBarBackgroundColor:(UIColor *)backgroundColor style:(UIStatusBarStyle)style { + self.statusBarView.backgroundColor = backgroundColor; + self.statusBarStyle = style; + + // Triggers preferredStatusBarStyle + [self.parentViewController setNeedsStatusBarAppearanceUpdate]; +} + +- (UIStatusBarStyle)preferredStatusBarStyle { + return self.statusBarStyle; +} + +- (void)expandStatusBarView { + __weak typeof(self) weakSelf = self; + [MVMCoreDispatchUtility performBlockOnMainThread:^{ + weakSelf.statusBarBottomConstraint.active = YES; + weakSelf.statusBarHeightConstraint.active = NO; + [weakSelf.view layoutIfNeeded]; + }]; +} + +- (void)collapseStatusBarView { + __weak typeof(self) weakSelf = self; + [MVMCoreDispatchUtility performBlockOnMainThread:^{ + weakSelf.statusBarBottomConstraint.active = NO; + weakSelf.statusBarHeightConstraint.active = YES; + [weakSelf.view layoutIfNeeded]; + }]; +} + #pragma mark - View Cyle - (void)loadView { @@ -849,6 +885,17 @@ CGFloat const PanelAnimationDuration = 0.2; view.translatesAutoresizingMaskIntoConstraints = NO; self.view = view; + // Status bar + UIView *statusBarView = [MVMCoreUICommonViewsUtility commonView]; + statusBarView.backgroundColor = [UIColor whiteColor]; + [self.view addSubview:statusBarView]; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[statusBarView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(statusBarView)]]; + id topGuide = view.safeAreaLayoutGuide; + self.statusBarBottomConstraint = [NSLayoutConstraint constraintWithItem:statusBarView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:topGuide attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; + self.statusBarBottomConstraint.active = YES; + self.statusBarHeightConstraint = [statusBarView.heightAnchor constraintEqualToConstant:0]; + self.statusBarView = statusBarView; + // Top Alert MVMCoreUITopAlertView *topAlertView = nil; if ([[CoreUIObject sharedInstance].globalTopAlertDelegate respondsToSelector:@selector(getTopAlertView)]) { @@ -894,9 +941,9 @@ CGFloat const PanelAnimationDuration = 0.2; self.bottomProgressBarHeightConstraint = bottomProgressHeight; if (topAlertView) { - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[topAlertView]-0-[mainView]-0-[progressView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topAlertView, mainView, progressView)]]; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[statusBarView]-0-[topAlertView]-0-[mainView]-0-[progressView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(statusBarView,topAlertView, mainView, progressView)]]; } else { - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[mainView]-0-[progressView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(mainView, progressView)]]; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[statusBarView]-0-[mainView]-0-[progressView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(statusBarView,mainView, progressView)]]; } // Add tabbar if we have it. @@ -924,7 +971,6 @@ CGFloat const PanelAnimationDuration = 0.2; - (void)viewDidLoad { [super viewDidLoad]; - [self.topAlertView pinATopViewController:self]; // Creates the back button self.backButton = [[UIBarButtonItem alloc] initWithImage:[self imageForBackButton] style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed:)]; @@ -1008,36 +1054,6 @@ CGFloat const PanelAnimationDuration = 0.2; } } -- (UIStatusBarStyle)preferredStatusBarStyle { - if (self.topAlertView.topAlertObject) { - return self.topAlertView.statusBarStyle; - } else { - UIStatusBarStyle style = [self getDefaultStatusBarStyle]; - [self.topAlertView resetDefaultBackgroundColor:[self getDefaultStatusBarBackgroundColor] basedOnStatusBarStyle:style]; - return style; - } -} - -- (UIStatusBarStyle)getDefaultStatusBarStyle { - UIViewController *viewController = [self getCurrentDetailViewController]; - if ([viewController conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)] - && [viewController respondsToSelector:@selector(defaultStatusBarStyle)] - && [((UIViewController *)viewController) defaultStatusBarStyle]) { - return [((UIViewController *)viewController) defaultStatusBarStyle]; - } - return UIStatusBarStyleDefault; -} - -- (UIColor *)getDefaultStatusBarBackgroundColor { - UIViewController *viewController = [self getCurrentDetailViewController]; - if ([viewController conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)] - && [viewController respondsToSelector:@selector(defaultStatusBarBackgroundColor)] - && [((UIViewController *)viewController) defaultStatusBarBackgroundColor]) { - return [((UIViewController *)viewController) defaultStatusBarBackgroundColor]; - } - return nil; -} - - (BOOL)isAPanelShowing { return fabs(self.mainViewLeading.constant) > 1; } diff --git a/MVMCoreUI/TopAlert/MVMCoreTopAlertViewProtocol.h b/MVMCoreUI/TopAlert/MVMCoreTopAlertViewProtocol.h index e10cec10..e799e858 100644 --- a/MVMCoreUI/TopAlert/MVMCoreTopAlertViewProtocol.h +++ b/MVMCoreUI/TopAlert/MVMCoreTopAlertViewProtocol.h @@ -13,16 +13,19 @@ @optional -// Show based on the object +/// Show based on the object - (void)showWithTopAlertObject:(nullable MVMCoreTopAlertObject *)topAlertObject animationDelegate:(nonnull id )animationDelegate completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; -// Hides +/// Removes the notification - (void)hideAlertView:(BOOL)forceful completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; -// Collapses the notification if it has a short top message. Otherwise removes notification. +/// Collapses the notification if it has a short top message. Otherwise removes notification. - (void)collapseNotification; /// Updates the existing top alert with the new object - (void)updateTopAlertWith:(nullable MVMCoreTopAlertObject *)topAlertObject; +/// Returns if the top alert is currently utilizing the status bar. +- (BOOL)overridingStatusBar; + @end diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView+Extension.swift b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView+Extension.swift index 0328f03c..46765385 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView+Extension.swift +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView+Extension.swift @@ -109,7 +109,7 @@ public extension MVMCoreUITopAlertView { // Update status bar. guard let statusBarDelegate = molecule as? StatusBarUI else { return } let statusBarUI = statusBarDelegate.getStatusBarUI() - self.setStatusBarColor(statusBarUI.color, statusBarStyle: statusBarUI.style) + MVMCoreUISplitViewController.main()?.setStatusBarBackgroundColor(statusBarUI.color, style: statusBarUI.style) }) } diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.h b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.h index 5bb033d7..fad65957 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.h +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.h @@ -19,8 +19,6 @@ @interface MVMCoreUITopAlertView : UIView -@property (nonatomic, readonly) UIStatusBarStyle statusBarStyle; - // Delegate for the top alert view @property (nonatomic, nullable, weak) id animationDelegate; @@ -36,16 +34,6 @@ // Returns a TopAlertView with the mvm styling. Also sets the property in the session. + (nullable instancetype)setupTopAlertView; -// Pins the status bar view at the top of the passed in view controller. -- (void)pinATopViewController:(nonnull UIViewController *)viewController; - -// For controlling the status bar view -- (void)expandStatusBarView; -- (void)collapseStatusBarView; - -/// reset status bar background color, when backgroundColor is nil corresponding background color will be set based on style -- (void)resetDefaultBackgroundColor:(nullable UIColor *)backgroundColor basedOnStatusBarStyle:(UIStatusBarStyle)style; - // Can be subclassed for custom views. - (nonnull UIView *)topAlertViewForTopAlertObject:(nullable MVMCoreTopAlertObject *)topAlertObject animationDelegate:(nonnull id )animationDelegate statusBarColor:(UIColor *_Nullable *_Nullable)statusBarColor statusBarStyle:(UIStatusBarStyle *_Nullable)statusBarStyle; @@ -55,7 +43,4 @@ /// Get the content color based on the type - (nonnull UIColor *)getContentColorForType:(nullable NSString *)type; -// Set the status bar color. Used for updating the status bar when the view changes. -- (void)setStatusBarColor:(nullable UIColor *)statusBarColor statusBarStyle:(UIStatusBarStyle)style; - @end diff --git a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m index eba4cfcc..c0835541 100644 --- a/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m +++ b/MVMCoreUI/TopAlert/MVMCoreUITopAlertView.m @@ -33,12 +33,6 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; @interface MVMCoreUITopAlertView () -@property (nonatomic, readwrite) UIStatusBarStyle statusBarStyle; -@property (weak, nonatomic) UIView *statusBarView; -@property (strong, nonatomic) NSLayoutConstraint *statusBarHeightConstraint; -@property (strong, nonatomic) NSLayoutConstraint *statusBarBottomConstraint; - -@property (weak, nonatomic) UIView *alertView; @property (weak, nullable, nonatomic, readwrite) UIView *currentAlert; @property (strong, nonatomic) NSLayoutConstraint *height; @@ -48,6 +42,8 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; /// Used if we delayed the collapse due to accessibility. @property (copy, nonatomic) void (^ hideCompletionHandler)(BOOL finished); +@property (nonatomic) BOOL currentAlertOverridingStatusBar; + @end @implementation MVMCoreUITopAlertView @@ -88,34 +84,11 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; } - (void)setupView { - if (!self.statusBarView) { - self.clipsToBounds = YES; - - UIView *statusBarView = [MVMCoreUICommonViewsUtility commonView]; - UIView *alertView = [MVMCoreUICommonViewsUtility commonView]; - [self addSubview:alertView]; - [self addSubview:statusBarView]; - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[statusBarView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(statusBarView)]]; - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[alertView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(alertView)]]; - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[statusBarView]-0-[alertView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(statusBarView,alertView)]]; - self.statusBarHeightConstraint = [statusBarView.heightAnchor constraintEqualToConstant:0]; - self.statusBarHeightConstraint.active = YES; - self.height = [alertView.heightAnchor constraintEqualToConstant:0]; - self.height.active = YES; - self.alertView = alertView; - self.statusBarView = statusBarView; - - [self setStatusBarColor:[UIColor whiteColor] statusBarStyle:UIStatusBarStyleDefault]; - - [self registerWithNotificationCenter]; - } -} - -- (void)pinATopViewController:(UIViewController *)viewController { - self.statusBarHeightConstraint.active = NO; - id topGuide = viewController.view.safeAreaLayoutGuide; - self.statusBarBottomConstraint = [NSLayoutConstraint constraintWithItem:self.statusBarView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:topGuide attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; - self.statusBarBottomConstraint.active = YES; + if (self.height) { return; } + self.clipsToBounds = YES; + self.height = [self.heightAnchor constraintEqualToConstant:0]; + self.height.active = YES; + [self registerWithNotificationCenter]; } - (void)updateView:(CGFloat)size { @@ -159,38 +132,6 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; } } -- (void)showWithTopAlertObject:(nullable MVMCoreTopAlertObject *)topAlertObject animationDelegate:(nonnull id )animationDelegate completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { - - self.animationDelegate = animationDelegate; - dispatch_async(dispatch_get_main_queue(), ^{ - - self.topAlertObject = topAlertObject; - self.topAlertClearspotView = nil; - - UIColor *statusBarColor = nil; - UIStatusBarStyle statusBarStyle = UIStatusBarStyleDefault; - UIView *view = [self topAlertViewForTopAlertObject:topAlertObject animationDelegate:animationDelegate statusBarColor:&statusBarColor statusBarStyle:&statusBarStyle]; - if ([view conformsToProtocol:@protocol(MVMCoreViewProtocol)]) { - [((UIView *)view) updateView:CGRectGetWidth(self.bounds)]; - } - if (!statusBarColor) { - statusBarColor = [UIColor whiteColor]; - } - [self setStatusBarColor:statusBarColor statusBarStyle:statusBarStyle]; - [self showAlertView:view topAlertObject:topAlertObject completionHandler:completionHandler]; - }); -} - -- (void)updateTopAlertWith:(MVMCoreTopAlertObject *)topAlertObject { - [self updateMoleculeWith:topAlertObject]; -} - -- (void)setStatusBarColor:(nullable UIColor *)statusBarColor statusBarStyle:(UIStatusBarStyle)style { - self.statusBarView.backgroundColor = statusBarColor; - self.statusBarStyle = style; - [[MVMCoreUISession sharedGlobal].splitViewController.parentViewController setNeedsStatusBarAppearanceUpdate]; -} - - (void)updateAccessibilityForTopAlert:(nullable UIView *)view { // Update accessibility with top alert if ([view isKindOfClass:[MVMCoreUITopAlertBaseView class]]) { @@ -212,7 +153,7 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; if (weakSelf.currentAlert.superview) { [weakSelf.currentAlert removeFromSuperview]; } - [weakSelf.alertView addSubview:view]; + [weakSelf addSubview:view]; [NSLayoutConstraint constraintPinSubviewToSuperview:view]; weakSelf.currentAlert = view; @@ -241,6 +182,40 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; [[MVMCoreNavigationHandler sharedNavigationHandler] addNavigationOperation:operation]; } + +/// If the voice over user leaves top alert focus, hide. +- (void)accessibilityFocusChanged:(NSNotification *)notification { + if (notification.userInfo[UIAccessibilityFocusedElementKey] && ![MVMCoreUIUtility viewContainsAccessiblityFocus:self]) { + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityElementFocusedNotification object:nil]; + [self hideAlertView:YES completionHandler:self.hideCompletionHandler]; + self.hideCompletionHandler = nil; + } +} + +#pragma mark - MVMCoreTopAlertViewProtocol + +- (void)showWithTopAlertObject:(nullable MVMCoreTopAlertObject *)topAlertObject animationDelegate:(nonnull id )animationDelegate completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { + + self.animationDelegate = animationDelegate; + dispatch_async(dispatch_get_main_queue(), ^{ + + self.topAlertObject = topAlertObject; + self.topAlertClearspotView = nil; + + UIColor *statusBarColor = nil; + UIStatusBarStyle statusBarStyle = UIStatusBarStyleDefault; + UIView *view = [self topAlertViewForTopAlertObject:topAlertObject animationDelegate:animationDelegate statusBarColor:&statusBarColor statusBarStyle:&statusBarStyle]; + if ([view conformsToProtocol:@protocol(MVMCoreViewProtocol)]) { + [((UIView *)view) updateView:CGRectGetWidth(self.bounds)]; + } + if (statusBarColor) { + self.currentAlertOverridingStatusBar = YES; + [[MVMCoreUISplitViewController mainSplitViewController] setStatusBarBackgroundColor:statusBarColor style:statusBarStyle]; + } + [self showAlertView:view topAlertObject:topAlertObject completionHandler:completionHandler]; + }); +} + - (void)hideAlertView:(BOOL)forceful completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { // If accessible and focused, do not collapse until unfocused. if (!forceful && [MVMCoreUIUtility viewContainsAccessiblityFocus:self]) { @@ -278,9 +253,12 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; completionHandler(finished); } weakSelf.topAlertObject = nil; - [MVMCoreDispatchUtility performBlockOnMainThread:^{ - [weakSelf setStatusBarColor:[UIColor whiteColor] statusBarStyle:UIStatusBarStyleDefault]; - }]; + if (weakSelf.currentAlertOverridingStatusBar) { + weakSelf.currentAlertOverridingStatusBar = NO; + [MVMCoreDispatchUtility performBlockOnMainThread:^{ + [[MVMCoreUISplitViewController mainSplitViewController] setStatusBarForCurrentViewController]; + }]; + } }]; }]; }]; @@ -288,6 +266,11 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; [[MVMCoreNavigationHandler sharedNavigationHandler] addNavigationOperation:operation]; } + +- (void)updateTopAlertWith:(MVMCoreTopAlertObject *)topAlertObject { + [self updateMoleculeWith:topAlertObject]; +} + - (void)collapseNotification { if (self.currentAlert) { if ([self.currentAlert isKindOfClass:[MVMCoreUITopAlertExpandableView class]] && ((MVMCoreUITopAlertExpandableView *)self.currentAlert).shortView.label.text.length > 0) { @@ -301,45 +284,8 @@ NSString * const MFAccTopAlertClosed = @"Top alert notification is closed."; } } -- (void)expandStatusBarView { - __weak typeof(self) weakSelf = self; - [MVMCoreDispatchUtility performBlockOnMainThread:^{ - weakSelf.statusBarBottomConstraint.active = YES; - weakSelf.statusBarHeightConstraint.active = NO; - [weakSelf.superview layoutIfNeeded]; - }]; -} - -- (void)collapseStatusBarView { - __weak typeof(self) weakSelf = self; - [MVMCoreDispatchUtility performBlockOnMainThread:^{ - weakSelf.statusBarBottomConstraint.active = NO; - weakSelf.statusBarHeightConstraint.active = YES; - [weakSelf.superview layoutIfNeeded]; - }]; -} - -- (void)resetDefaultBackgroundColor:(UIColor *)backgroundColor basedOnStatusBarStyle:(UIStatusBarStyle)style { - if (!self.topAlertObject) { - UIColor *defaultStatusBarBackgroundColor = backgroundColor; - if (!defaultStatusBarBackgroundColor) { - defaultStatusBarBackgroundColor = style == UIStatusBarStyleDefault ? [UIColor whiteColor] : [UIColor blackColor]; - } - - //color doesn't match the current default value - if (!CGColorEqualToColor(defaultStatusBarBackgroundColor.CGColor, self.statusBarView.backgroundColor.CGColor)) { - self.statusBarView.backgroundColor = defaultStatusBarBackgroundColor; - } - } -} - -/// If the voice over user leaves top alert focus, hide. -- (void)accessibilityFocusChanged:(NSNotification *)notification { - if (notification.userInfo[UIAccessibilityFocusedElementKey] && ![MVMCoreUIUtility viewContainsAccessiblityFocus:self]) { - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIAccessibilityElementFocusedNotification object:nil]; - [self hideAlertView:YES completionHandler:self.hideCompletionHandler]; - self.hideCompletionHandler = nil; - } +- (BOOL)overridingStatusBar { + return self.currentAlertOverridingStatusBar; } @end