0

我创建了一个空项目,该项目只允许横向方向,其情节提要仅包含 UIViewController 作为 rootViewController,其中心有一个按钮。

仅横向

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

预期的是,当单击该按钮时,视图向左移动了 320,但不幸的是,视图正在逆时针旋转并同时向左移动。似乎应用程序以某种方式认为它被设置为纵向视图,并考虑到这一点来翻译视图,这就是发生的事情:

旋转而不是向左移动

我确定我在这里遗漏了一些东西,但我不知道它是什么。

我试图在 viewController 上定义方法- (BOOL)shouldAutorotate- (NSUInteger)supportedInterfaceOrientations但它并没有改变这种行为。

任何帮助,将不胜感激。

提前致谢

4

2 回答 2

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's subview( 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
于 2012-12-03T22:19:11.210 回答
1

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

- (IBAction)onClick:(UIButton *)sender {
    sender.superview.transform = CGAffineTransformTranslate(sender.superview.transform, -320, 0);
}
于 2012-12-03T21:45:34.023 回答