请问有人可以详细解释一下iOS在处理横向方向时,为什么会按照特定的框架和变换方式来进行处理吗?
我指的是通过在不同的视图生命周期方法中记录视图描述所展示出的行为:
viewDidLoad: "UIView: 0x1edb5ba0; frame = (0 0; 568 320); autoresize = W+H; layer = <CALayer: 0x1edb5c50>"
viewWillAppear: "UIView: 0x1edb5ba0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x1edb5c50>"
viewDidAppear: "UIView: 0x1edb5ba0; frame = (0 0; 320 568); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x1edb5c50>"
这样做的后果是微妙的,但非常有趣。
例如,我使用“初始界面方向”和“支持的界面方向”均设置为“横屏(右侧home按钮)”启动我的应用程序,
然后像这样显示我的根视图控制器:
self.viewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
self.window.rootViewController = self.viewController;
这个.xib文件的方向被设置为横向,其框架大小为0、0、568、320。它能正确显示,并且我可以触摸屏幕上的所有点。
然而,当我这样呈现一个子视图时,问题就出现了:
SomeView *someView = [[SomeView alloc] initWithFrame:self.view.frame];
[self.view addSubview:someView];
现在,self.view.frame的值为(0 0; 320 568),而self.view.transform的值为transform = [0, 1, -1, 0, 0, 0]。最好情况下,最终结果是我只能触摸到刚刚显示的视图的左侧320像素,最糟糕的情况是视图的布局被破坏。
通过各种stackoverflow上的问题,我学会了正确的方法:
SomeView *someView = [[SomeView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:someView]
我还没有学到的是为什么,我对此非常好奇。
更让我好奇的是为什么在实例化和显示期间视图会被操纵。
已经有一段时间我没有使用过只有景观的应用程序了,但出于某种原因,我认为当前的实现与早期版本的iOS不同,这是正确的吗?