在我的应用程序(代码非常类似于Apple的WWDC10的PhotoScroller演示)中,我有一个UIScrollView.在滚动视图中,我用以下代码覆盖了layoutSubviews:
- (void) layoutSubviews {
[super layoutSubviews];
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
...
}
Run Code Online (Sandbox Code Playgroud)
在iOS 4.x中,如果应用程序在横向模式下启动(用户将其保持为横向),则layoutSubviews将被调用两次(非常快).第一次调用它时,boundsSize具有指示其纵向的尺寸,但之后立即再次调用它,self.bounds.size返回指示设备处于landsacpe并且我的布局计算正常工作的尺寸.
在iOS 5.x中,layoutSubviews仅调用一次,其中bounds.size返回指示纵向的尺寸,并且它没有得到第二次调用,因此我的所有计算代码都搞砸了.
如果用户physcially旋转设备,然后layoutSubviews被调用和正常工作 - 这样用户就开始横向应用(平不正确地),旋转为纵向(平correcty),然后转回到风景(现提请正确).
它是我缺少的layoutSubviews的第二次"自动"调用.
有人注意到这个或有什么建议吗?
更新:
我确实在iOS 5的UIKit发行说明中找到了这个,但我不确定它是否相关,甚至是这种变化的影响.
iOS 5中的旋转回调不适用于通过全屏显示的视图控制器.这意味着,如果你的代码呈现了另一个视图控制器视图控制器,然后用户随后旋转设备,以不同的取向,在解雇,底层控制器(即呈现控制器)将不会收到任何旋转回调.但请注意,呈现控制器将获得aviewWillLayoutSubviews来电时它被重新显示,并且interfaceOrientation属性可以从这种方法进行查询和使用正确铺陈控制器.
进一步更新:
使用[UIView recursiveDescription],转储视图层次结构,我得到以下输出:
iOS 4(运行正常):
肖像:
2011-12-19 15:57:06.400 stroom[10889:11603] <0x5e7f9b0 stroomViewController.m:(402)> <UIView: 0x6a6f2f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x6a659d0>>
| <UIScrollView: 0x5e911e0; frame = (-20 0; 808 1024); clipsToBounds = …Run Code Online (Sandbox Code Playgroud) 我的iPad应用程序大量使用自动旋转.这很棒.然而,我注意到,如果一个隐藏的视图是由默认实现释放didReceiveMemoryWarning(如描述在这里),当画面从笔尖重新加载,我正好是在景观,它加载它的肖像.这会对界面造成严重破坏,直到我手动旋转iPad并强制它进入正确的方向.
我原以为iOS会在当前方向加载视图; 这就是应用程序启动时的功能.但它没有,不是在被卸下之后didReceiveMemoryWarning.为什么不?我怎么能这样做呢?