2012-12-03 53 views
0

我創建了一個空的項目,只允許在故事板中只包含一個UIViewController作爲rootViewController的中心的按鈕。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

我敢肯定,我在這裏失去了一些東西,但我有不知道它是什麼。

我試過在viewController上定義的方法,如- (BOOL)shouldAutorotate- (NSUInteger)supportedInterfaceOrientations但它並沒有改變這種行爲。

任何幫助,將不勝感激。

在此先感謝

回答

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); 
}