Положение касания iOS8 ограничено в ландшафте, как если бы окно было портным с одной стороны?
У меня есть странная проблема с iOS8. Я бегаю и бичу головой о стену на пару дней без везения. Я не совсем уверен, как это объяснить, но здесь идет...
Приложения работают под управлением iOS7, но теперь компиляция с использованием xCode 6/iOS8 у меня возникает несколько странных проблем с ориентацией. Я не использую xib файл, но вместо этого создаю окно и просматриваю программно. Я запускаю OpenGL в представлении, а затем обрабатываю все остальное внутри OpenGL. Итак, я собираю штрихи и передаю их своим подпрограммам GL. Все было прекрасно навсегда, до сих пор.
Теперь с iOS8 кажется, что "сенсорное окно" вращается так, что касание в Пейзаже ограничено одной стороной экрана, как если бы в окне дисплея был "Пейзаж", но все касаются в окне "Портрет", установлен на одной стороне экрана.
То, что кажется странным, - это то, что прикосновение к экрану выглядит как обычно, но значение Y останавливается на 320 и больше не идет. Х действует нормально. Если я верну устройство на портрет (контроллер просмотра не будет автоматически вращаться), все будет работать, но в Landscape он переключится на это странное поведение.
Я пробовал все, о чем я могу думать без каких-либо изменений, и не знаю, с чего начать, почему это может произойти. Любые советы были бы с благодарностью.
Ответы
Ответ 1
В iOS8 UIScreen теперь ориентирован на интерфейс. В некоторых (или я должен сказать все) библиотеки до iOS8, некоторые проверки были выполнены, чтобы отрегулировать этот недостаток и ширину и высоту подкачки, когда приложение было в ландшафте.
Вы должны посмотреть на некоторый код, который делает некоторое вращение и удалять его.
-[UIScreen bounds]
,
-[UIScreen applicationFrame]
,
Строка строки состояния и
Каркас клавиатуры теперь ориентирован на интерфейс.
(см. видео WWDC2014 - просмотреть улучшения контроллера в iOS8 @50:41)
Ответ 2
В нашем случае.
Сила для поворота с преобразованием вида вызвала эту проблему.
Мы удалили этот код, повернем с помощью
+ (void)attemptRotationToDeviceOrientation
и проблема решена.
Мы вызвали этот метод в нашем методе forceRotate.
-(void)forceRotateLandscape {
...
UIViewController *vc = [UIViewController new];
[topVc presentViewController:vc animated:NO completion:nil];
[topVc dismissViewControllerAnimated:NO completion:nil];
supportedOrientations = UIInterfaceOrientationMaskLandscapeRight;
[UIViewController attemptRotationToDeviceOrientation];
...
}
Ответ 3
Я предполагаю, что любой вид, принадлежащий распознавателю жестов, не изменяется во время вращения для одного (или более) из следующих причин:
- Он использует автоматический макет и не привязан к его супервизу.
- Он использует пружины и распорки и не имеет правильной маски UIViewAutoresizing
- Он живет в подвью, который не изменяется.
Если вы используете автоматический макет, попробуйте это в своем контроллере просмотра:
- (void)viewDidLayoutSubviews
{
// For each subview with its own auto layout:
[self.mySubview layoutSubviews];
// ...
[super viewDidLayoutSubviews];
}
Ответ 4
Хорошо, я нашел проблему на моей стороне (я даритель щедрости).
Мы, вероятно, использовали какой-то взлом в нашем приложении, чтобы вручную обрабатывать вращение наших представлений, потому что мы возвращали 0 в - (NSUInteger)supportedInterfaceOrientations
в наш rootViewController.
- (NSUInteger)supportedInterfaceOrientations {
return 0; // BOOOOOOO, even forbidden by documentation
}
Затем мы вручную управляем нашими внутренними представлениями, слушая уведомление UIDeviceRotationChanged, поворачивая их виды и также запрашивая, чтобы statusBar тоже вращался.
Возвращая что-то, кроме 0, к этому supportedInterfaceOrientations
заставил слой касания вращаться вместе с остальными.
Но теперь мы должны сделать код развиваться, чтобы использовать ротацию iOS вместо нашего хакерского слоя.
Кроме того, после изучения больше, особенно на iPad, у вас есть, чтобы использовать UIWindow на основе раскадровки.
Использование окна на основе XIB приведет к неправильным измерениям при запуске приложения в ландшафтном режиме. Это приводит к горам багги кадров и беспорядок плохо с нашей макет.
Ответ 5
У меня была та же проблема. В iOS7 все работало нормально, в iOS8 это было похоже на то, что "touch-view" все еще был в портрете.
Я просто заменил основной xib раскадрой, никаких других изменений (я много пробовал играть с привязкой к экрану и рамкой без каких-либо результатов).
Просто попробуйте, дайте мне знать, если он будет работать и для вас. Удачи.
Ответ 6
У меня такая же проблема со вторым окном в ландшафте. Он отказывается отображать себя на полном экране, а также получать события касания на разрезанной части экрана. Единственным решением, которое я нашел до сих пор, является поддержка поддержки собственных разрешений iPhone6 /6 + путем добавления необходимых экранов запуска. Если вы не поддерживаете эти разрешения в своем приложении, это может быть одной и той же проблемой.