重新创建UIViewcontroller的视图时,如何强制旋转?

时间:2012-11-16 01:59:29

标签: iphone ios cocoa-touch

我有一个我正在重复使用的视图控制器(出于内存限制的原因。)因此,我只是设置了一些参数,而不是推送一个新的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的一些讨论后,答案结果是“不要那样做”。请参阅评论,了解一些细节和重新设计。

1 个答案:

答案 0 :(得分:3)

你的问题在于使用它:

[window addSubview: self.view];

来自文档:

  

如果向UIWindow添加其他视图控制器的UIView属性   (与主视图控制器处于同一级别)通过以下方式:

     

[myWindow addSubview:anotherController.view];

     

此附加视图控制器不会接收旋转事件和   永远不会旋转。只有第一个视图控制器添加到UIWindow   会旋转。

https://developer.apple.com/library/ios/#qa/qa2010/qa1688.html

我更喜欢具有根视图控制器的设计,并且子视图被添加到根视图控制器的视图中。

另一种选择是不要杀死视图并重新添加它,而是更新在该视图中需要更新的所有内容。我不确定我理解为什么你想杀死一个视图并立即重新添加它。