From e7239e1ce3026a287a1ccc8d4a361487e0cb6b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 15 Oct 2014 12:03:40 +0200 Subject: iOS: Fade out statusbar when scrolling view due to VKB Change-Id: I86923a2b2aa2d17d79ba3a11cabf37e615eaf4cc Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/ios/qiosinputcontext.mm | 2 + src/plugins/platforms/ios/qiosviewcontroller.h | 1 + src/plugins/platforms/ios/qiosviewcontroller.mm | 90 ++++++++++++++----------- 3 files changed, 52 insertions(+), 41 deletions(-) (limited to 'src/plugins/platforms/ios') diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm index ac6e339633..b403154321 100644 --- a/src/plugins/platforms/ios/qiosinputcontext.mm +++ b/src/plugins/platforms/ios/qiosinputcontext.mm @@ -399,6 +399,8 @@ void QIOSInputContext::scroll(int y) animation.toValue = [NSValue valueWithCATransform3D:translationTransform]; [rootView.layer addAnimation:animation forKey:@"AnimateSubLayerTransform"]; rootView.layer.sublayerTransform = translationTransform; + + [rootView.qtViewController updateProperties]; } completion:^(BOOL){ if (self) diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h index cbb28aec0d..586edd589d 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.h +++ b/src/plugins/platforms/ios/qiosviewcontroller.h @@ -41,6 +41,7 @@ class QIOSScreen; @property (nonatomic, assign) BOOL changingOrientation; @property (nonatomic, assign) BOOL prefersStatusBarHidden; +@property (nonatomic, assign) UIStatusBarAnimation preferredStatusBarUpdateAnimation; - (id)initWithQIOSScreen:(QIOSScreen *)screen; - (void)updateProperties; diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index ca8d48bf6d..a2d81e3b6c 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -150,6 +150,7 @@ // Status bar may be initially hidden at startup through Info.plist self.prefersStatusBarHidden = infoPlistValue(@"UIStatusBarHidden", false); + self.preferredStatusBarUpdateAnimation = UIStatusBarAnimationNone; QObject::connect(qApp, &QGuiApplication::focusWindowChanged, [self]() { [self updateProperties]; @@ -182,47 +183,6 @@ // ------------------------------------------------------------------------- -- (void)updateProperties -{ - if (!isQtApplication()) - return; - - QWindow *focusWindow = QGuiApplication::focusWindow(); - - // If we don't have a focus window we leave the statusbar - // as is, so that the user can activate a new window with - // the same window state without the status bar jumping - // back and forth. - if (!focusWindow) - return; - - // We only care about changes to focusWindow that involves our screen - if (!focusWindow->screen() || focusWindow->screen()->handle() != m_screen) - return; - - // All decisions are based on the the top level window - focusWindow = qt_window_private(focusWindow)->topLevelWindow(); - - bool currentStatusBarVisibility = self.prefersStatusBarHidden; - self.prefersStatusBarHidden = focusWindow->windowState() == Qt::WindowFullScreen; - if (self.prefersStatusBarHidden != currentStatusBarVisibility) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { - [self setNeedsStatusBarAppearanceUpdate]; - } else -#endif - { - [[UIApplication sharedApplication] - setStatusBarHidden:self.prefersStatusBarHidden - withAnimation:UIStatusBarAnimationNone]; - } - - [self.view setNeedsLayout]; - } -} - -// ------------------------------------------------------------------------- - -(BOOL)shouldAutorotate { // Until a proper orientation and rotation API is in place, we always auto rotate. @@ -298,6 +258,54 @@ m_screen->updateProperties(); } +// ------------------------------------------------------------------------- + +- (void)updateProperties +{ + if (!isQtApplication()) + return; + + QWindow *focusWindow = QGuiApplication::focusWindow(); + + // If we don't have a focus window we leave the statusbar + // as is, so that the user can activate a new window with + // the same window state without the status bar jumping + // back and forth. + if (!focusWindow) + return; + + // We only care about changes to focusWindow that involves our screen + if (!focusWindow->screen() || focusWindow->screen()->handle() != m_screen) + return; + + // All decisions are based on the the top level window + focusWindow = qt_window_private(focusWindow)->topLevelWindow(); + + bool hasScrolledRootViewDueToVirtualKeyboard = + !CATransform3DIsIdentity(self.view.layer.sublayerTransform); + + bool currentStatusBarVisibility = self.prefersStatusBarHidden; + self.prefersStatusBarHidden = focusWindow->windowState() == Qt::WindowFullScreen + || hasScrolledRootViewDueToVirtualKeyboard; + self.preferredStatusBarUpdateAnimation = hasScrolledRootViewDueToVirtualKeyboard ? + UIStatusBarAnimationFade : UIStatusBarAnimationNone; + + if (self.prefersStatusBarHidden != currentStatusBarVisibility) { +#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { + [self setNeedsStatusBarAppearanceUpdate]; + } else +#endif + { + [[UIApplication sharedApplication] + setStatusBarHidden:self.prefersStatusBarHidden + withAnimation:self.preferredStatusBarUpdateAnimation]; + } + + [self.view setNeedsLayout]; + } +} + #if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_7_0) - (UIStatusBarStyle)preferredStatusBarStyle { -- cgit v1.2.3