Приложение для iPhone находится в ландшафтном режиме, но границы представления по-прежнему портретные - PullRequest
6 голосов
/ 13 сентября 2009

Что на самом деле происходит за сценой, когда вы устанавливаете ориентацию телефона в альбомный режим? Когда я проследил границы основного экрана и границы любого подпредставления, ширина и высота по-прежнему составляют 320x480, а не 480x320.

Есть идеи почему?

Ответы [ 6 ]

1 голос
/ 16 сентября 2010

Я обнаружил, что если вы не используете UINavigationController, у вас могут возникнуть проблемы с вашим видом, если ему не дано правильное представление и границы кадра.

Я непосредственно добавлял представления в окно UIWindow, и у меня возникла именно эта проблема. Но когда я поместил UINavigationController между UIWindow и UIViews, проблема исчезла.

Надеюсь, что поможет

1 голос
/ 03 сентября 2010

Это большая тема, но я добавлю, что составляет 0,02; комментарии ограничены изменениями между портретом и ландшафтом; то есть не такие вещи, как вверх ногами, лицом вверх, лицом вниз и неизвестность.

  1. Если вид не прослушивает изменения ориентации, то рамка и границы остаются неизменными независимо от ориентации.

  2. Если представление зарегистрировано для прослушивания изменений ориентации, тогда границы могут измениться ; т. е. в альбомной ориентации весь кадр экрана составляет <320 480>, а границы - <480 320>. Это предполагает:

    а. вы используете либо обратный вызов shouldAutorotateToInterfaceOrientation с соответствующими возвращаемыми значениями YES, либо

    б. явная регистрация в центре уведомлений для прослушивания UIDeviceOrientationDidChangeNotification.

  3. Подход 2a будет выполняться только для представлений, принадлежащих корневому контроллеру окна приложения; то есть контроллер представления, вид которого был добавлен первым. Подход 2b можно использовать в сочетании с аффинными преобразованиями и ручными изменениями границ, чтобы получить правильную компоновку ориентации для видов, не управляемых авторотацией.

1 голос
/ 13 сентября 2009

Вы проверяете свойство bounds или свойство frame? Некоторые элементы управления, особенно UIViews, которые заполняют экран, по-видимому, поддерживают один и тот же кадр в любой ориентации; Я думаю, что AppKit устанавливает свойство transform для поворота их содержимого.

Возможно, вы обнаружите, что свойство bounds имеет значение, которое вы ожидаете большую часть времени, а свойство frame - нет.

0 голосов
/ 31 января 2012

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

Быстрый след преобразования представления дает мне это:

2012-01-31 12:19:02.114 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortrait
2012-01-31 12:19:02.116 TestScollviewRotation[9834:207] 0.000000 -1.000000 1.000000 0.000000

2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationPortraitUpsideDown
2012-01-31 12:21:41.898 TestScollviewRotation[9834:207] 0.000000 1.000000 -1.000000 0.000000

2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeRight
2012-01-31 12:21:58.780 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000

2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] orientation: UIDeviceOrientationLandscapeLeft
2012-01-31 12:19:03.181 TestScollviewRotation[9834:207] 1.000000 0.000000 -0.000000 1.000000
0 голосов
/ 15 июля 2010

У меня сейчас та же проблема с приложением для iPad.

Я «решил» это, запросив представления interfaceOrientation, и если это либо UIDeviceOrientationPortrait, либо UIDeviceOrientationPortraitUpsideDown, то я вручную установил фрейм моего подслоя в представлении (то есть CAGradientLayer).

0 голосов
/ 18 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...