我的 iPad 应用大量使用了自动旋转。这很棒。但是,我注意到,如果隐藏视图由(如此处所述)的默认实现释放,didReceiveMemoryWarning
当视图从笔尖重新加载并且我碰巧处于横向时,它会以纵向加载它。这会对界面造成严重破坏,直到我手动旋转 iPad 并强制它转到正确的方向。
我曾假设 iOS 会以当前方向加载视图;这就是应用程序启动时所做的事情。但它不,不是在被卸载后didReceiveMemoryWarning
。为什么不?我怎样才能让它做到这一点?
我的 iPad 应用大量使用了自动旋转。这很棒。但是,我注意到,如果隐藏视图由(如此处所述)的默认实现释放,didReceiveMemoryWarning
当视图从笔尖重新加载并且我碰巧处于横向时,它会以纵向加载它。这会对界面造成严重破坏,直到我手动旋转 iPad 并强制它转到正确的方向。
我曾假设 iOS 会以当前方向加载视图;这就是应用程序启动时所做的事情。但它不,不是在被卸载后didReceiveMemoryWarning
。为什么不?我怎样才能让它做到这一点?
由dbarker的指针确定的答案是,在默认实现卸载视图后重新加载视图时,不会调用视图控制器的旋转方法,包括-willRotateToInterfaceOrientation:duration:
and 。我不知道为什么在应用启动时会有所不同,但我确实有一个解决方法-willAnimateRotationToInterfaceOrientation:duration:
didReceiveMemoryWarning
我所做的是将一个名为 in 的布尔 ivar 设置unloadedByMemoryWarning
为YES
in didReceiveMemoryWarning
,如下所示:
- (void) didReceiveMemoryWarning {
unloadedByMemoryWarning = YES;
[super didReceiveMemoryWarning];
}
然后,在 中viewDidLoad
,如果该标志为真,我将其设置为NO
然后自己调用旋转方法:
if (unloadedByMemoryWarning) {
unloadedByMemoryWarning = NO;
[self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
[self willAnimateRotationToInterfaceOrientation:self.interfaceOrientation duration:0];
[self didRotateFromInterfaceOrientation:self.interfaceOrientation];
}
有点糟糕,我必须这样做,但它确实有效,现在我不太担心因为使用太多内存而被 iOS 杀死。
我认为 iOS 5 可能会解决这个问题。
对于 iOS 4.3,我很幸运地修复了另一个问题。从笔尖加载后:
[parent.view addSubview:nibView];
nibView.frame = parent.view.frame;
[nibView setNeedsLayout];
如果可行,您可以抛弃unloadedByMemoryWarning
逻辑,因为每次加载都是安全的。从这里得到提示和代码(基本上)。