我有一个我正在重复使用的视图控制器(出于内存限制的原因。)因此,我只是设置了一些参数,而不是推送一个新的UIViewController,然后强制这个VC重新加载它的视图。代码是这样的(由通知回调触发):
- (void) reloadView: (NSNotification*) note
{
// Save parameters for reloaded view
UIWindow *window = (UIWindow*) self.view.superview;
//CGAffineTransform xfrm = self.view.transform; // Doesn't do what I want.
// Trash this one & reload the view
[self.view removeFromSuperview];
self.view = nil;
// force view reload
if (self.view == nil)
{
NSLog(@"%s ***** Why didn't self.view reload?!", __PRETTY_FUNCTION__);
}
else
{
// restore params
//self.view.transform = xfrm; // Boo-hoo!
[window addSubview: self.view];
}
}
一切正常 除了 以外该应用只是横向广告,而新重新加载的视图会作为肖像添加到窗口中。
我尝试将旧视图的变换强制转换为新视图,但奇怪的是,它给出了旋转但是一个愚蠢的平移偏移。
有没有办法告诉UIViewController“你的轮换,现在”......?
修改 的
我添加了这个相当愚蠢的黑客:
// restore params
self.view.transform = xfrm;
self.view.center = CGPointMake(window.bounds.size.width / 2., window.bounds.size.height / 2.);
[window addSubview: self.view];
给出了期望的结果,但我真的很不满意在我的代码库中有这样的东西。当然有更好的方法来做到这一点?!?!
谢谢!
修改 的
经过与JPH的一些讨论后,答案结果是“不要那样做”。请参阅评论,了解一些细节和重新设计。
答案 0 :(得分:3)
你的问题在于使用它:
[window addSubview: self.view];
来自文档:
如果向UIWindow添加其他视图控制器的UIView属性 (与主视图控制器处于同一级别)通过以下方式:
[myWindow addSubview:anotherController.view];
此附加视图控制器不会接收旋转事件和 永远不会旋转。只有第一个视图控制器添加到UIWindow 会旋转。
https://developer.apple.com/library/ios/#qa/qa2010/qa1688.html
我更喜欢具有根视图控制器的设计,并且子视图被添加到根视图控制器的视图中。
另一种选择是不要杀死视图并重新添加它,而是更新在该视图中需要更新的所有内容。我不确定我理解为什么你想杀死一个视图并立即重新添加它。