Подтвердить что ты не робот

Положение касания iOS8 ограничено в ландшафте, как если бы окно было портным с одной стороны?

У меня есть странная проблема с iOS8. Я бегаю и бичу головой о стену на пару дней без везения. Я не совсем уверен, как это объяснить, но здесь идет...

Приложения работают под управлением iOS7, но теперь компиляция с использованием xCode 6/iOS8 у меня возникает несколько странных проблем с ориентацией. Я не использую xib файл, но вместо этого создаю окно и просматриваю программно. Я запускаю OpenGL в представлении, а затем обрабатываю все остальное внутри OpenGL. Итак, я собираю штрихи и передаю их своим подпрограммам GL. Все было прекрасно навсегда, до сих пор.

Теперь с iOS8 кажется, что "сенсорное окно" вращается так, что касание в Пейзаже ограничено одной стороной экрана, как если бы в окне дисплея был "Пейзаж", но все касаются в окне "Портрет", установлен на одной стороне экрана.

То, что кажется странным, - это то, что прикосновение к экрану выглядит как обычно, но значение Y останавливается на 320 и больше не идет. Х действует нормально. Если я верну устройство на портрет (контроллер просмотра не будет автоматически вращаться), все будет работать, но в Landscape он переключится на это странное поведение.

Я пробовал все, о чем я могу думать без каких-либо изменений, и не знаю, с чего начать, почему это может произойти. Любые советы были бы с благодарностью.

4b9b3361

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