为啥 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 释放后?的主要内容,如果未能解决你的问题,请参考以下文章