【问题标题】:Landscape only iPhone app with multiple nibs具有多个笔尖的仅横向 iPhone 应用程序
【发布时间】:2010-12-25 20:55:22
【问题描述】:

我正在开发一个有多个笔尖的 iPhone 应用程序,并且应该只是横向的。

应用程序通过其 Info.plist 文件设置为以横向模式启动。

我有两个视图控制器: FirstViewControllerSecondViewController

对于其中的每一个,我都有一个 nib 文件,其中视图是横向的。两个视图控制器都作为插座添加到我的MainView nib 中,并且它们的视图被延迟初始化。

当应用程序加载时,第一个视图按预期显示为横向。但是,当我切换到第二个视图时,设备(或模拟器)仍处于横向状态,但视图会旋转,就好像设备处于纵向模式一样,这会影响我的界面。

在两个UIViewController 类中,我都有以下代码:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

并在我的应用程序委托中切换视图:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

其中viewControllersecondViewController 是连接视图控制器的两个出口。

这是第二个视图在 IB 中的样子: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

这是它在模拟器中的样子: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

为什么第二个视图是横向显示但界面是旋转的?

我不想处理转换属性,因为这似乎有点过头了。

【问题讨论】:

    标签: iphone landscape


    【解决方案1】:

    我为这个问题加注了星标,希望有人能给你一个有见地的回答,我会学到一些东西。遗憾的是,我担心你可能需要使用转换来让它正常工作。这是我最近用来解决问题的代码:

    - (void)forceLandscapeForView:(UIView *)theView {
      theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
      theView.bounds = CGRectMake(0, 0, 480, 320);
      theView.center = CGPointMake(160, 240);
      [theView setNeedsLayout];
      [theView setNeedsDisplay];
    }
    

    然后,当您添加新视图时,检查当前方向并在必要时强制旋转:

    if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
      [self forceLandscapeForView:_activeViewController.view];
    }
    

    当然,您需要在每个视图控制器中适当地响应shouldAutorotateToInterfaceOrientation

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
      return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }
    

    如果不是全部必要,我很想听听其他解决方案。我注意到此设置还有一个警告:如果您在视图之间进行转换,并且在该转换期间旋转手机,则视图方向可能会翻转或“卡”在错误的横向方向上,例如当您在视图之间导航时,您需要将手机翻转(横向与横向)。

    【讨论】:

    • 到目前为止,这被证明是实现我想要的最可靠的方法。
    • 这(第一种方法)对我有用。几个小时以来一直在寻找解决方案,我之前尝试过类似的方法(但在视图中 didLoad...)。在将其添加为子视图之前应用上述转换。
    【解决方案2】:

    这只是一个建议,但您可以尝试在第二个视图的 shouldAotorotate 方法中返回 NO。或者尝试在 IB 的纵向视图中制作它。看来您的视图已正确加载(在横向模式下),但随后收到 shouldAutorotate 消息并已旋转 90 度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多