我有一个项目,使用sdk4.3在xcode 3.2.6下成功运行 . 它包含大量的自定义控件和动画 . 但客户要我使用xcode 4.0.2 . 所以我已经下载了它(xcode 4.0.2 build 4A2002a)并且已经探索过我的应用程序没有按预期工作 .
所有视图都有意想不到的坐标 . 我使用私有API函数 recursiveDescription 来转储我的子视图树 . 这就是我得到的:

<UIView: 0x4e0f160; frame = (0 0; 1024 768); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x4e0f210>>
   | <UIView: 0x4e0fc50; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0x4e0fca0>>
   |    | <UIToolbar: 0x4e1afd0; frame = (0 980; 768 44); autoresize = W+TM; layer = <CALayer: 0x4e1a9a0>>
   |    |    | <UIButton: 0x4e1cba0; frame = (12 6; 72 33); opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x4e1cca0>>

虽然预期:

<UIView: 0x590d420; frame = (0 0; 1024 768); autoresize = W+H; layer = <CALayer: 0x590d4f0>>
   | <UIView: 0x590e720; frame = (0 0; 1024 768); autoresize = RM+BM; layer = <CALayer: 0x5918500>>
   |    | <UIToolbar: 0x5919050; frame = (0 724; 1024 44); autoresize = W+TM; layer = <CALayer: 0x59190f0>>
   |    |    | <UIButton: 0x591a7e0; frame = (12 6; 72 33); opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x591a600>>

我注意到转换属性已添加到最顶层的视图中 . 应该提到的是,我的应用程序仅在横向方向上工作,这在所有NIB和项目属性中都有说明 . 此外,每个视图控制器都有一个 shouldAutorotateToInterfaceOrientation 方法,用于检查要切换到的模式是否为横向模式 .

手动将transform属性更改为 CGAffineTransformIdentity 会将所有视图移动到其位置,但将屏幕向左旋转90度(从预期的横向位置) . 但是在设备轮换之后,所有视图都返回到他们的位置(这一事实震惊了我) . 将transform属性更改为 CGAffineTransformMakeRotation(M_PI_2) 会导致我之前遇到的问题 .

您能否与我分享有关设置最顶层视图的转换属性的内容和原因的任何想法?这是XCode还是我自己的bug?