Qt для iOS блокируется при запуске приложения лицевой стороной вверх. (утверждение qiosscreen.mm)

Я мигрирую проект Qt для iOS в Qt 5.5. В iOS 5.1.1, по крайней мере, приложение не запускается, если вы запускаете его устройством вверх. Утверждение отображает ошибку в qiosscreen.mm в строке 344. Вот функция исходного кода Qt, которая не работает:

Qt::ScreenOrientation QIOSScreen::orientation() const
{
    // Auxiliary screens are always the same orientation as their primary orientation
    if (m_uiScreen != [UIScreen mainScreen])
        return Qt::PrimaryOrientation;

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

    // At startup, iOS will report an unknown orientation for the device, even
    // if we've asked it to begin generating device orientation notifications.
    // In this case we fall back to the status bar orientation, which reflects
    // the orientation the application was started up in (which may not match
    // the physical orientation of the device, but typically does unless the
    // application has been locked to a subset of the available orientations).
    if (deviceOrientation == UIDeviceOrientationUnknown)
        deviceOrientation = UIDeviceOrientation([UIApplication sharedApplication].statusBarOrientation);

    // If the device reports face up or face down orientations, we can't map
    // them to Qt orientations, so we pretend we're in the same orientation
    // as before.
    if (deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown) {
        Q_ASSERT(screen());
        return screen()->orientation();
    }

    return toQtScreenOrientation(deviceOrientation);
}

Отображает утверждение в

 Q_ASSERT(screen());

screen() должен возвращать 0, поэтому screen()-> direction() пытается отменить нулевой указатель. Эта функция screen() определена в родительском классе, QPlatformScreen:

QScreen *QPlatformScreen::screen() const
{
    Q_D(const QPlatformScreen);
    return d->screen;
}

Конструктор для этого класса инициализирует d->screen как 0:

QPlatformScreen::QPlatformScreen()
    : d_ptr(new QPlatformScreenPrivate)
{
    Q_D(QPlatformScreen);
    d->screen = 0;
}

Из комментариев я делаю вывод, что экран d-> установлен в какой-то момент, когда ориентация является книжной или альбомной, а затем они возвращаются к этому, когда он становится лицом вверх / вниз. Так как все начинается с лицевой стороны вверх, ранее нет хорошего значения, к которому можно вернуться.

Кто-нибудь еще сталкивался с этим или есть решение? Кстати, я не собираюсь из исходного кода qt и не хочу, поэтому изменение их кода не является для меня решением, если я могу избежать этого.

1 ответ

Решение

Я обнаружил, что это происходит только при запуске приложения из XCode или QtCreator. Если я запускаю приложение на устройстве обычным образом, эта ошибка, похоже, будет предотвращена.

Другие вопросы по тегам