簡體   English   中英

CGAffineTransformMakeTranslation導致iOS6上的視圖旋轉

[英]CGAffineTransformMakeTranslation causing view rotation on iOS6

我創建了一個空項目,該情節僅允許情節提要與故事板一起使用,該情節提要僅包含一個UIViewController作為rootViewController並在其中心有一個按鈕。

僅橫向

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

可以預期的是,當單擊該按鈕時,視圖向左移動320,但是不幸的是,發生的事情是視圖在逆時針方向旋轉並同時向左移動。 似乎應用程序以某種方式認為已將其設置為縱向視圖,並在考慮到該視圖的情況下轉換了視圖,這是發生的情況:

旋轉而不是向左移動

我確定我在這里遺漏了一些東西,但我不知道它是什么。

我試圖在viewController上定義方法,例如- (BOOL)shouldAutorotate shouldAutorotate和- (NSUInteger)supportedInterfaceOrientations但它沒有改變這種行為。

任何幫助,將不勝感激。

提前致謝

您的應用程序有一個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] UIView: 0x942c380 ]的轉換? 該變換將您的頂級視圖逆時針旋轉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

您需要將轉換應用於其現有轉換。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM