Система координат UIWindow всегда находится в портретной ориентации.Он применяет вращение, устанавливая преобразование представления своего rootViewController.Например, я создал тестовое приложение, используя шаблон с одним представлением, и запустил его.В портретной ориентации:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>>
| <UIView: 0x96290e0; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x96286a0>>
После поворота влево:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>>
| <UIView: 0x96290e0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>>
После поворота вправо:
(gdb) po [[(id)UIApp keyWindow] recursiveDescription]
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>>
| <UIView: 0x96290e0; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>>
Обратите внимание, как установлено преобразование (в 90-матрица поворота градусов), когда устройство поворачивается.
Относительно вашего вопроса о размере UIView: границы представления находятся в своем собственном координатном пространстве, и по умолчанию источник границ представления находится в начале координат (0,0) его координатного пространства.Кадр представления находится в координатном пространстве его родителя.Вы можете увидеть 20 ожидаемых значений в рекурсивных описаниях выше или распечатав рамку напрямую:
(gdb) p (CGRect)[[[[(id)UIApp keyWindow] subviews] lastObject] frame]
$2 = {
origin = {
x = 0,
y = 20
},
size = {
width = 768,
height = 1004
}
}