为什么不自动从一个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杀死。
-
我认为iOS 5可能会解决这个问题。
-
对于iOS 4.3,我已经有了另一个修复的好运气。 从笔尖加载后:
[parent.view addSubview:nibView]; nibView.frame = parent.view.frame; [nibView setNeedsLayout];
如果这样做,你可以抛弃
unloadedByMemoryWarning
逻辑,因为每个负载都是安全的。 从这里得到了提示和代码(基本上)。