代码之家  ›  专栏  ›  技术社区  ›  zoul

在多个视图之间切换,同时考虑方向

  •  1
  • zoul  · 技术社区  · 16 年前

    我有一个MVC应用程序,只有一个模型和几个视图(类似于皮肤)。我希望用户能够切换视图,我不能让它与界面方向的工作。最简单的方法如下所示:

    - (void) switchToADifferentView: (UIView*) newView {
        // self is a descendant of UIViewController
        self.view = newView;
    }
    

    test case ). 有没有办法在视图上强制定向?看起来系统真的很努力地为自己保留接口控件(或者像手动设置正确的变换一样简单?)

    我想我最好不要直接切换视图,而是切换控制器。这是有意义的,因为它使初始代码更简单。但是如何切换它们之间没有导航关系的控制器呢?我想我需要 presentModalViewController: ,但这似乎是一个黑客。导航控制器也是如此。如果我用手交换控制器,我会再次得到错误的方向:

    - (void) switchToAController: (id) incoming {
        [currentController.view removeFromSuperview];
        [window addSubview:incoming.view]; // does not respect current orientation
    }
    

    怎么回事

    2 回复  |  直到 16 年前
        1
  •  1
  •   zoul    16 年前

    直接使用第一个代码示例切换视图时,可以通过手动设置变换来固定方向:

    - (CGAffineTransform) transformForOrientation: (UIInterfaceOrientation) io
    {
        NSParameterAssert(io <= 4);
        // unknown, portrait, portrait u/d, landscape L, landscape R
        float angles[] = {0, 0, M_PI, M_PI/2, -M_PI/2};
        return CGAffineTransformMakeRotation(angles[io]);
    }
    
    - (void) switchToView: (UIView*) newView
    {
        newView.transform = [self transformForOrientation:self.interfaceOrientation];
        self.view = newView;
    }
    

    另外,如果您想在旋转过程中交换视图,事情会变得更加复杂。首先,必须根据当前视图变换传入视图。这必须在 willRotate… 回拨:

    - (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) target
             duration: (NSTimeInterval) duration
    {
        incomingView = [[UIView alloc] init…];
        incomingView.transform = self.view.transform;
    }
    

    willAnimate… 回调并根据目标方向设置变换:

    - (void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) io
             duration: (NSTimeInterval) duration
    {
        incomingView.transform = [self transformForOrientation:io];
        self.view = incomingView;
    }
    

    这样,新视图将替换当前视图,并平滑地旋转到目标位置。

        2
  •  0
  •   zoul    16 年前

    最后我选择了蹦床的方式。每个皮肤都是一个单独的控制器,并且有一个特殊的根控制器,它将皮肤表示为模态控制器。当皮肤想要切换到另一个皮肤时,它会设置一个标志,指示所需的下一个皮肤并解除自身。根控制器唤醒( viewWillAppear ),注意该标志并显示下一个蒙皮。

    此解决方案有两个主要优点:1]控制器代码保持简单,因为每个控制器只显示一个视图,没有视图切换。2] 无需破解方向代码,因为系统透明地处理模式显示控制器中的视图方向。

    推荐文章