为啥 iOS 不自动旋转从 Nib 加载的视图在被 didReceiveMemoryWarning 释放后?

Posted

技术标签:

【中文标题】为啥 iOS 不自动旋转从 Nib 加载的视图在被 didReceiveMemoryWarning 释放后?【英文标题】:Why Doesn't iOS Autorotate a View loaded from a Nib after it was released by didReceiveMemoryWarning?为什么 iOS 不自动旋转从 Nib 加载的视图在被 didReceiveMemoryWarning 释放后? 【发布时间】:2011-01-11 07:45:51 【问题描述】:

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

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

【问题讨论】:

视图是否在视图层次结构之外(不是 UIViewController 视图的子视图)? @dbarker - 不,实际上它是应用程序的主视图。 @dbarker 啊,但是仔细看,我发现它的子视图没有正确旋转。笔尖中包含的子视图已正确旋转。有点。人力资源管理系统。我的-willAnimateRotationToInterfaceOrientation:duration: 方法可能有问题。也许它没有被调用,因为旋转没有动画? 是的,-willRotateToInterfaceOrientation:duration:-willAnimateRotationToInterfaceOrientation:duration: 都没有被调用。它们都在应用启动时被调用…… 听起来不错 - 当视图(重新)加载时不会调用旋转回调。对于不由 nib 管理的视图,您需要手动将它们调整为 UIViewController#interfaceOrientation 返回的方向。不确定,但可能这就是笔尖在幕后所做的。 【参考方案1】:

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

我所做的是在didReceiveMemoryWarning 中将一个名为unloadedByMemoryWarning 的布尔型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 杀死。

【讨论】:

我在 iPad 应用程序中遇到了同样的问题。这是一种奇怪的行为,但你的解决方案帮助了我。 尝试了该解决方案,但不幸的是,我没有这样做。 Bleh... 继续深入【参考方案2】:

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

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

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

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

【讨论】:

以上是关于为啥 iOS 不自动旋转从 Nib 加载的视图在被 didReceiveMemoryWarning 释放后?的主要内容,如果未能解决你的问题,请参考以下文章

Nib 文件在加载时忽略状态栏。为啥?

iOS 从 nib 加载视图会造成内存泄漏?

在这个项目中,为啥我无法访问从 nib 加载的视图属性?

如何获取从 nib ios 加载的自定义视图的实际大小

加载另一个 Nib 时的 iOS 自动布局

ios - 从 nib 文件加载解耦视图