iOS: Remove plumbing for QWindow::reportContentOrientationChange
The [UIApplication setStatusBarOrientation:animated] API has been deprecated since iOS 8, and a no-op since iOS 13. It is no longer possible to report the orientation of a view or view controller independently of the orientation of the view itself. This was problematic because we were applying additional logic to our screen geometry mapping based on the assumption that the API was still doing something, resulting in broken auto rotation when calling reportContentOrientationChange(). Removing the iOS implementation for reportContentOrientationChange makes this API a no-op on QWindow as well, as no other platforms seem to implement it. We should perhaps consider re-thinking the screen orientation APIs in this light. [ChangeLog][iOS] QWindow::reportContentOrientationChange no longer has any effect on iOS, as the APIs used to implement this on iOS are no longer available. Task-number: QTBUG-38576 Task-number: QTBUG-121781 Change-Id: I5b129d21c990332170599c2580e389e252140d6f Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>bb10
parent
021b5e3d3f
commit
c0f6d10bc2
|
|
@ -278,31 +278,6 @@ void QIOSScreen::updateProperties()
|
|||
#else
|
||||
m_geometry = QRectF::fromCGRect(m_uiScreen.bounds).toRect();
|
||||
|
||||
#ifndef Q_OS_TVOS
|
||||
if (m_uiScreen == [UIScreen mainScreen]) {
|
||||
QIOSViewController *qtViewController = [m_uiWindow.rootViewController isKindOfClass:[QIOSViewController class]] ?
|
||||
static_cast<QIOSViewController *>(m_uiWindow.rootViewController) : nil;
|
||||
|
||||
if (qtViewController.lockedOrientation) {
|
||||
Q_ASSERT(!qt_apple_isApplicationExtension());
|
||||
|
||||
// Setting the statusbar orientation (content orientation) on will affect the screen geometry,
|
||||
// which is not what we want. We want to reflect the screen geometry based on the locked orientation,
|
||||
// and adjust the available geometry based on the repositioned status bar for the current status
|
||||
// bar orientation.
|
||||
|
||||
Qt::ScreenOrientation statusBarOrientation = toQtScreenOrientation(
|
||||
UIDeviceOrientation(qt_apple_sharedApplication().statusBarOrientation));
|
||||
|
||||
Qt::ScreenOrientation lockedOrientation = toQtScreenOrientation(UIDeviceOrientation(qtViewController.lockedOrientation));
|
||||
QTransform transform = transformBetween(lockedOrientation, statusBarOrientation, m_geometry).inverted();
|
||||
|
||||
m_geometry = transform.mapRect(m_geometry);
|
||||
m_availableGeometry = transform.mapRect(m_availableGeometry);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (m_geometry != previousGeometry) {
|
||||
// We can't use the primaryOrientation of screen(), as we haven't reported the new geometry yet
|
||||
Qt::ScreenOrientation primaryOrientation = m_geometry.width() >= m_geometry.height() ?
|
||||
|
|
|
|||
|
|
@ -18,8 +18,6 @@ QT_END_NAMESPACE
|
|||
- (void)handleShortcut:(UIKeyCommand*)keyCommand;
|
||||
|
||||
#ifndef Q_OS_TVOS
|
||||
@property (nonatomic, assign) UIInterfaceOrientation lockedOrientation;
|
||||
|
||||
// UIViewController
|
||||
@property (nonatomic, assign) BOOL prefersStatusBarHidden;
|
||||
@property (nonatomic, assign) UIStatusBarAnimation preferredStatusBarUpdateAnimation;
|
||||
|
|
|
|||
|
|
@ -241,8 +241,6 @@
|
|||
|
||||
self.changingOrientation = NO;
|
||||
#ifndef Q_OS_TVOS
|
||||
self.lockedOrientation = UIInterfaceOrientationUnknown;
|
||||
|
||||
// Status bar may be initially hidden at startup through Info.plist
|
||||
self.prefersStatusBarHidden = infoPlistValue(@"UIStatusBarHidden", false);
|
||||
self.preferredStatusBarUpdateAnimation = UIStatusBarAnimationNone;
|
||||
|
|
@ -309,26 +307,6 @@
|
|||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
- (BOOL)shouldAutorotate
|
||||
{
|
||||
#if !defined(Q_OS_TVOS) && !defined(Q_OS_VISIONOS)
|
||||
return self.platformScreen && self.platformScreen->uiScreen() == [UIScreen mainScreen] && !self.lockedOrientation;
|
||||
#else
|
||||
return NO;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (NSUInteger)supportedInterfaceOrientations
|
||||
{
|
||||
// As documented by Apple in the iOS 6.0 release notes, setStatusBarOrientation:animated:
|
||||
// only works if the supportedInterfaceOrientations of the view controller is 0, making
|
||||
// us responsible for ensuring that the status bar orientation is consistent. We enter
|
||||
// this mode when auto-rotation is disabled due to an explicit content orientation being
|
||||
// set on the focus window. Note that this is counter to what the documentation for
|
||||
// supportedInterfaceOrientations says, which states that the method should not return 0.
|
||||
return [self shouldAutorotate] ? UIInterfaceOrientationMaskAll : 0;
|
||||
}
|
||||
|
||||
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
|
||||
{
|
||||
self.changingOrientation = YES;
|
||||
|
|
@ -460,51 +438,6 @@
|
|||
[self setNeedsStatusBarAppearanceUpdate];
|
||||
[self.view setNeedsLayout];
|
||||
}
|
||||
|
||||
|
||||
// -------------- Content orientation ---------------
|
||||
|
||||
UIApplication *uiApplication = qt_apple_sharedApplication();
|
||||
|
||||
static BOOL kAnimateContentOrientationChanges = YES;
|
||||
|
||||
Qt::ScreenOrientation contentOrientation = focusWindow->contentOrientation();
|
||||
if (contentOrientation != Qt::PrimaryOrientation) {
|
||||
// An explicit content orientation has been reported for the focus window,
|
||||
// so we keep the status bar in sync with content orientation. This will ensure
|
||||
// that the task bar (and associated gestures) are also rotated accordingly.
|
||||
|
||||
if (!self.lockedOrientation) {
|
||||
// We are moving from Qt::PrimaryOrientation to an explicit orientation,
|
||||
// so we need to store the current statusbar orientation, as we need it
|
||||
// later when mapping screen coordinates for QScreen and for returning
|
||||
// to Qt::PrimaryOrientation.
|
||||
self.lockedOrientation = uiApplication.statusBarOrientation;
|
||||
}
|
||||
|
||||
[uiApplication setStatusBarOrientation:
|
||||
UIInterfaceOrientation(fromQtScreenOrientation(contentOrientation))
|
||||
animated:kAnimateContentOrientationChanges];
|
||||
|
||||
} else {
|
||||
// The content orientation is set to Qt::PrimaryOrientation, meaning
|
||||
// that auto-rotation should be enabled. But we may be coming out of
|
||||
// a state of locked orientation, which needs some cleanup before we
|
||||
// can enable auto-rotation again.
|
||||
if (self.lockedOrientation) {
|
||||
// First we need to restore the statusbar to what it was at the
|
||||
// time of locking the orientation, otherwise iOS will be very
|
||||
// confused when it starts doing auto-rotation again.
|
||||
[uiApplication setStatusBarOrientation:self.lockedOrientation
|
||||
animated:kAnimateContentOrientationChanges];
|
||||
|
||||
// Then we can re-enable auto-rotation
|
||||
self.lockedOrientation = UIInterfaceOrientationUnknown;
|
||||
|
||||
// And finally let iOS rotate the root view to match the device orientation
|
||||
[UIViewController attemptRotationToDeviceOrientation];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ public:
|
|||
|
||||
void setWindowState(Qt::WindowStates state) override;
|
||||
void setParent(const QPlatformWindow *window) override;
|
||||
void handleContentOrientationChange(Qt::ScreenOrientation orientation) override;
|
||||
void setVisible(bool visible) override;
|
||||
void setOpacity(qreal level) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -382,16 +382,6 @@ void QIOSWindow::updateWindowLevel()
|
|||
m_windowLevel = qMax(transientParentWindow->m_windowLevel, m_windowLevel);
|
||||
}
|
||||
|
||||
void QIOSWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
|
||||
{
|
||||
// Update the QWindow representation straight away, so that
|
||||
// we can update the statusbar orientation based on the new
|
||||
// content orientation.
|
||||
qt_window_private(window())->contentOrientation = orientation;
|
||||
|
||||
[m_view.qtViewController updateProperties];
|
||||
}
|
||||
|
||||
void QIOSWindow::applicationStateChanged(Qt::ApplicationState)
|
||||
{
|
||||
if (isForeignWindow())
|
||||
|
|
|
|||
Loading…
Reference in New Issue