Ответ 1
Система координат 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
}
}