0

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

4

1 回答 1

3

你的问题是在使用这个:

[window addSubview: self.view];

从文档中:

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

[myWindow addSubview:anotherController.view];

这个额外的视图控制器不会接收旋转事件,也永远不会旋转。只有添加到 UIWindow 的第一个视图控制器会旋转。

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

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

另一种选择是不终止视图并重新添加它,而是更新该视图中需要更新的所有内容。我不确定我是否理解您为什么要终止视图并立即重新添加它。

于 2012-11-16T02:57:56.660 回答