Поворот некоторых UIViews, но не все? - PullRequest
2 голосов
/ 25 февраля 2011

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

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

Я нашел решение, но оно кажется хакерским:

  1. Создать окно.
  2. Создайте несколько автоматически вращающихся UIViewControllers.
  3. Добавьте свои виды в окно.
  4. Создайте контроллер представления OpenGL ES, который не с автоповоротом.
  5. Добавить свой вид в окно.
  6. Вызовите yieldSubviewToFront: для автоматически повернутых видов.
  7. Дайте себе высокие пять, стараясь не обращать внимания на ноющее чувство, что на самом деле это отвратительный взлом.

Кто-нибудь знает лучшее решение? NB: Я абсолютно уверен, что хочу автоматически поворачивать представления UIKit, а не представление GL.

Спасибо за ваше время, высоко ценится. =) * * 1 029

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Я придумал другую стратегию для подобной ситуации. В моем случае я позволяю всем представлениям вращаться, но затем использую преобразование, чтобы вернуть представление, которое я хочу сохранить устойчивым, к его первоначальной ориентации. Это работает, потому что «не вращающийся» вид квадратный, но с немного большей математикой он может работать и для других фигур. Вот что я положил в свой willRotateToInterfaceOrientation:duration:

switch (toInterfaceOrientation) {
    case UIInterfaceOrientationPortrait:
        steadyView.transform = CGAffineTransformIdentity;
        break;
    case UIInterfaceOrientationLandscapeLeft:
        steadyView.transform = CGAffineTransformMakeRotation(M_PI_2);
        break;
    case UIInterfaceOrientationPortraitUpsideDown:
        steadyView.transform = CGAffineTransformMakeRotation(M_PI);
        break;
    case UIInterfaceOrientationLandscapeRight:
        steadyView.transform = CGAffineTransformMakeRotation(3*M_PI_2);
        break;
}

steadyView - это подпредставление контроллера. Это, кажется, делает трюк.

1 голос
/ 26 февраля 2011

Нет лучшего способа сделать это лучше, чем вы предлагали.

Вы уверены, что не хотите просто вращать представления OpenGL?Если ваше приложение ограничено устройствами ES 2.0 и более поздней версией iOS 4.2, больше не будет никакого снижения производительности при использовании ротации UIViewController для представлений OpenGL.

0 голосов
/ 27 февраля 2011

Итак, я узнал, как это работает за кулисами; Фрогбласт прав, нет лучшего способа сделать это.

То, что происходит, - то, что, когда представление добавляется к окну, у которого нет подпредставлений, контроллер этого представления автоматически становится "полномочием вращения"; Если этот контроллер представления возвращает NO из shouldAutorotateToInterfaceOrientation, другие представления также не будут вращаться. Тем не менее, последующие виды (с контроллерами), добавленные в окно, по-прежнему могут не вращаться, даже если "право вращения" делает поворот.

Мне непонятно, почему они сделали это так, но у вас это есть.

0 голосов
/ 26 февраля 2011

Разве не было бы проще просто нарисовать ваш контент OpenGL при повороте? Просто примените вращение в вашем рендере, чтобы отменить вращение представления OpenGL.

Вы можете увидеть неприемлемый переход назад к исходному повороту, но вы можете легко решить эту проблему. Вы можете анимировать обратное вращение, как только вид закончится вращаться. Или вы можете переопределить willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: и willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:, чтобы анимировать контент, остающийся на месте во время поворота интерфейса.

...