2012-12-03 1 views
0

가운데에 버튼이있는 rootViewController로 UIViewController 만 포함하는 스토리 보드로 가로 방향을 허용하는 빈 프로젝트를 만듭니다. 예상CGAffineTransformMakeTranslation이 iOS6에서 뷰 회전을 야기 함

landscape orientation only http://f.cl.ly/items/12200e0h3k3P0P410X3o/Image%202012.12.03%2016:05:40.png

http://f.cl.ly/items/2U32301i2m0R0i1q071i/Image%202012.12.03%2016:07:15.png

- (IBAction)onClick:(UIButton *)sender { 
    sender.superview.transform = CGAffineTransformMakeTranslation(-320, 0); 
} 

은 버튼을 클릭하면 뷰가 왼쪽으로 (320)를 이동한다는 것입니다,하지만 불행히도 무슨 일 뷰가 반 시계 방향으로 회전되고에서 왼쪽으로 이동시키는 것입니다 동시. 어떻게 든 응용 프로그램이 세로보기로 설정하고 계정에 그것을 복용보기를 번역이라고 생각 보인다 이것은 무슨이다 :

rotating instead moving left http://f.cl.ly/items/1q1g1k3o3k0G191O3q2e/Image%202012.12.03%2016:12:25.png

내가 여기서 뭔가를 놓친 거지 확신하지만 난이 그것이 무엇인지 전혀 모른다.

저는 - (BOOL)shouldAutorotate- (NSUInteger)supportedInterfaceOrientations과 같은 viewController에서 메서드를 정의하려고했지만이 동작은 변경되지 않았습니다.

도움을 주시면 감사하겠습니다.

미리 감사드립니다.

답변

2

앱은 버튼이 들어 루트 뷰 컨트롤러의 뷰가 포함 된 UIWindow있다 :

  • UIWindow
    • 루트 뷰를
      • UIButton

당신이 이해하지 못했던 점은 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이보기의 변형을 재설정하여 적용한 번역을 잃게됩니다.

이 문제를 해결하는 올바른 방법은 이 아니며 최상위보기에 자신의 변환을 적용하는 것입니다. 당신은 변환 할 수있는 하위 뷰를 볼 최상위을주고, 그 내부에 버튼을 넣어 :

  • UIWindow
    • 루트보기
      • 하여 변형 가능한보기
        • UIButton
+0

올바르지 않습니다. 창에 적용된 변환은 그 안에 뷰 및 하위 뷰의 변환을 실행 취소하지 않습니다. 단순히 창에 변환을 적용합니다. –

+0

@AdamLockhart 저는 윈도우에 변형을 적용하는 것에 대해 이야기하지 않았습니다. zanona의 코드는 윈도우에 변형을 적용하지 않습니다. zanona의 코드가하는 것인데 윈도우의 서브 뷰에 변형을 적용하는 것에 대해 이야기했습니다. 나는 내 솔루션을 테스트하고 나는 당신을 테스트했다. 인터페이스가 다른 방향으로 회전하면 사용자의 번역이 손실됩니다. –

+0

당신은 "UIWindow는 당신이 적용한 번역을 잃어 버려서 당신의 뷰의 변환을 재설정 할 것"이라고 썼다. 이것은 믿기지가 않습니다. 나는 이것을 시험했다. 나는 모든 것을 포지셔닝하는 것이 변형을 적용하는 소프트웨어를 가지고있다. 사용자가 장치를 돌릴 때 이러한 변환이 손실되면 이는 터무니없는 것입니다. –

1

변환을 기존 변환에 적용해야합니다.

- (IBAction)onClick:(UIButton *)sender { 
    sender.superview.transform = CGAffineTransformTranslate(sender.superview.transform, -320, 0); 
}