为什么不自动从一个Nib加载的视图被didReceiveMemoryWarning发布之后呢?

我的iPad应用程序大量使用自动旋转。 这很棒。 但是,我注意到,如果一个隐藏的视图是由didReceiveMemoryWarning (如下所述)的默认实现释放的,当视图从笔尖重新加载,而我恰好处于横向时,它将以纵向加载。 这会对界面造成巨大的破坏,直到我手动旋转iPad并强制它进入正确的方向。

我曾经假设iOS会以当前的方向加载视图; 这就是应用程序启动时的function。 但不是, didReceiveMemoryWarning被卸载之后没有。 为什么不? 我怎样才能做到这一点?

这个答案是由dbarker指针决定的,当-willRotateToInterfaceOrientation:duration:的默认实现已经卸载了视图控制器的旋转方法(包括-willRotateToInterfaceOrientation:duration:-willAnimateRotationToInterfaceOrientation:duration: ,将不会调用视图视图。 我不知道为什么这将是不同的应用程序启动,但我有一个解决方法

我所做的是在didReceiveMemoryWarning中将一个名为unloadedByMemoryWarning的boolean ivar设置为YES ,如下所示:

 - (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杀死。

  1. 我认为iOS 5可能会解决这个问题。

  2. 对于iOS 4.3,我已经有了另一个修复的好运气。 从笔尖加载后:

     [parent.view addSubview:nibView]; nibView.frame = parent.view.frame; [nibView setNeedsLayout]; 

    如果这样做,你可以抛弃unloadedByMemoryWarning逻辑,因为每个负载都是安全的。 从这里得到了提示和代码(基本上)。

Interesting Posts