CGAffineTransformMakeTranslation导致iOS6上的视图旋转

时间:2012-12-03 16:15:04

标签: ios xcode uiview ios6 cgaffinetransform

我创建了一个空项目,只允许使用包含UIViewController的故事板的横向方向作为rootViewController,其中心有一个按钮。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您需要将变换应​​用于其现有变换。

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