5

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

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

4

2 回答 2

4

dbarker的指针确定的答案是,在默认实现卸载视图后重新加载视图时,不会调用视图控制器的旋转方法,包括-willRotateToInterfaceOrientation:duration:and 。我不知道为什么在应用启动时会有所不同,但我确实有一个解决方法-willAnimateRotationToInterfaceOrientation:duration:didReceiveMemoryWarning

我所做的是将一个名为 in 的布尔 ivar 设置unloadedByMemoryWarningYESin 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 杀死。

于 2011-01-12T05:08:27.330 回答
1
  1. 我认为 iOS 5 可能会解决这个问题。

  2. 对于 iOS 4.3,我很幸运地修复了另一个问题。从笔尖加载后:

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

    如果可行,您可以抛弃unloadedByMemoryWarning逻辑,因为每次加载都是安全的。从这里得到提示和代码(基本上)。

于 2012-01-05T14:37:13.977 回答