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. Если я запускаю приложение на устройстве обычным образом, эта ошибка, похоже, будет предотвращена.