iOS: Clarify implementation of QIOSWindow::isExposed()
We treat windows as exposed even if the application state is still inactive (e.g. during startup), otherwise there's a visible moment of black screen between the launch screen fading out and the app rendering its first pixel. Change-Id: I48368459a8a46fa1c5b2853ea88adfe1ac61b6f7 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@theqtcompany.com> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>bb10
parent
bf1e0b6008
commit
7212b52e85
|
|
@ -206,6 +206,25 @@ void QIOSWindow::applyGeometry(const QRect &rect)
|
|||
|
||||
bool QIOSWindow::isExposed() const
|
||||
{
|
||||
// Note: At startup of an iOS app it will enter UIApplicationStateInactive
|
||||
// while showing the launch screen, and once the application returns from
|
||||
// applicationDidFinishLaunching it will hide the launch screen and enter
|
||||
// UIApplicationStateActive. Technically, a window is not exposed until
|
||||
// it's actually visible on screen, and Apple also documents that "Apps
|
||||
// that use OpenGL ES for drawing must not use didFinishLaunching to
|
||||
// prepare their drawing environment. Instead, defer any OpenGL ES
|
||||
// drawing calls to applicationDidBecomeActive". Unfortunately, if we
|
||||
// wait until the applicationState reaches ApplicationActive to signal
|
||||
// that the window is exposed, we get a lag between hiding the launch
|
||||
// screen and blitting the first pixels of the application, as Qt
|
||||
// spends some time drawing those pixels in response to the expose.
|
||||
// In practice there doesn't seem to be any issues starting GL setup
|
||||
// and drawing from within applicationDidFinishLaunching, and this is
|
||||
// also the recommended approach for other 3rd party GL toolkits on iOS,
|
||||
// so we 'cheat', and report that a window is exposed even if the app
|
||||
// is in UIApplicationStateInactive, so that the startup transition
|
||||
// between the launch screen and the application content is smooth.
|
||||
|
||||
return qApp->applicationState() > Qt::ApplicationHidden
|
||||
&& window()->isVisible() && !window()->geometry().isEmpty();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue