앱은 버튼이 들어 루트 뷰 컨트롤러의 뷰가 포함 된 UIWindow
있다 :
당신이 이해하지 못했던 점은 UIWindow
이 루트에 회전 변환을 적용하여 사용자 인터페이스를 회전한다는 것입니다.
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $1 = 0x0922ee80 <UIWindow: 0x942c280; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x942c380>>
| <UIView: 0x9432b30; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x9432be0>>
| | <UIRoundedRectButton: 0x942f7a0; frame = (476 352; 73 44); opaque = NO; layer = <CALayer: 0x942f8c0>>
| | | <UIGroupTableViewCellBackground: 0x94300b0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x9430180>>
| | | <UIImageView: 0x9430af0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431340>>
| | | <UIButtonLabel: 0x94319c0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431d10>>
가
UIWindow
의 서브 뷰 (
UIView: 0x942c380
)는이
[0, -1, 1, 0, 0, 0]
의 변화가 얼마나 참조 : 인터페이스가 가로 왼쪽 방향으로있을 때 뷰 계층 구조를 살펴 보자? 이 변환은 최상위 뷰를 반 시계 방향으로 90도 회전시킵니다. 당신이 가로 오른쪽 방향으로 장치 (또는 시뮬레이터)를 회전 할 경우, 변환 것을 볼 것은
[0, 1, -1, 0, 0, 0]
된다 : 뷰가 돌아갑니다 있도록
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $2 = 0x07436d90 <UIWindow: 0x942c280; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x942c380>>
| <UIView: 0x9432b30; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x9432be0>>
| | <UIRoundedRectButton: 0x942f7a0; frame = (476 352; 73 44); opaque = NO; layer = <CALayer: 0x942f8c0>>
| | | <UIGroupTableViewCellBackground: 0x94300b0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x9430180>>
| | | <UIImageView: 0x9430af0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431340>>
| | | <UIButtonLabel: 0x94319c0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9431d10>>
당신이 뷰의 변환을 다시
, 당신은, 회전을 잃고 세로 회전 인 "기본"회전 인 0˚로 회전합니다.
Adam Lockhart의 대답은이 문제를 일시적으로 해결하지만 사용자가 기기를 돌리면 UIWindow
이보기의 변형을 재설정하여 적용한 번역을 잃게됩니다.
이 문제를 해결하는 올바른 방법은 이 아니며 최상위보기에 자신의 변환을 적용하는 것입니다. 당신은 변환 할 수있는 하위 뷰를 볼 최상위을주고, 그 내부에 버튼을 넣어 :
올바르지 않습니다. 창에 적용된 변환은 그 안에 뷰 및 하위 뷰의 변환을 실행 취소하지 않습니다. 단순히 창에 변환을 적용합니다. –
@AdamLockhart 저는 윈도우에 변형을 적용하는 것에 대해 이야기하지 않았습니다. zanona의 코드는 윈도우에 변형을 적용하지 않습니다. zanona의 코드가하는 것인데 윈도우의 서브 뷰에 변형을 적용하는 것에 대해 이야기했습니다. 나는 내 솔루션을 테스트하고 나는 당신을 테스트했다. 인터페이스가 다른 방향으로 회전하면 사용자의 번역이 손실됩니다. –
당신은 "UIWindow는 당신이 적용한 번역을 잃어 버려서 당신의 뷰의 변환을 재설정 할 것"이라고 썼다. 이것은 믿기지가 않습니다. 나는 이것을 시험했다. 나는 모든 것을 포지셔닝하는 것이 변형을 적용하는 소프트웨어를 가지고있다. 사용자가 장치를 돌릴 때 이러한 변환이 손실되면 이는 터무니없는 것입니다. –