0

我正在尝试根据用户在我的应用程序中的位置来定义支持的方向,我很难做到这一点。

到目前为止,我发现我应该使用现在在 iOS6 中支持的 supportedInterfaceOrientationsForWindow: 和 shouldAutorotate 方法,但是在我的 UIViewController 中定义它们的地方从来没有调用过这两种方法。

这就是我的代码的样子

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientationsForWindow {
    return UIInterfaceOrientationMaskPortrait;
}

在我的 Target Summary Supported Orientatoin 中,我取消了所有选项。我想我只会在每个 m ViewControllers 中定义支持的方向...我想知道这是否是正确的做法?

在此处输入图像描述

现在我已经阅读了我想要做的事情取决于我的应用程序的结构,所以在这里我将概述我的应用程序。

  • 主 UIViewController(3 个按钮将您带到(3 个不同的 navigationControllerViews)错误!只有一个 navigationController...抱歉,我已经很久没有查看此代码了。)
  • 辅助 UIViewController(保存导航控制器)
  • 其他 UIViewControllers(出现在辅助 NavigationController 中)

我希望每个 ViewController 直到 NavigationController 堆栈中的最后一个出现在 portrate 中。NavigationController 中的最后一个视图是一个特殊的视图,如果需要,它需要能够向左或向右旋转它的方向。

我想知道这是否可能,如果可能,为什么我上面的代码不能工作/被调用。

任何帮助将不胜感激。

// 更新问题 Re:

rootview加载(三个按钮,这是选择按钮以加载包含导航控制器的视图的方法)

- (IBAction)buttonClick: (UIButton *) sender
{   
//..

    // v ----->
    if ([sender isEqual:vUIButton]) {


        VSearchViewController *vSearchViewController = [[VSearchViewController alloc] initWithNibName:@"VSearchViewController" bundle:nil];
        [self.navigationController pushViewController:vehicalSearchViewController animated:YES];
    }
//..
}

然后在 VSearchViewController 中,我将新视图加载到 UINavigation 堆栈中,如下所示

//..
FModelsViewController *fModelsViewController = [[FModelsViewController alloc] initWithNibName:@"FModelsViewController" bundle:nil];

            // Sets the back button for the new view that loads (this overrides the usual parentview name with "Back")
            self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil];

            [self.navigationController pushViewController:fModelsViewController animated:YES];
//..

因此,在审查中,我已经在 appDelegate 中设置了导航控制器,并且我的应用程序中的所有视图都在 navigationStack 上......我说有 3 个 NavigationControllers 是错误的......只有一个并且每个视图都添加到堆栈中。 . 对此感到抱歉.. 自从我查看此代码以来已经一年半了..

4

2 回答 2

1

你是在 iOS6 上运行上面的代码吗?这些方法只会在 iOS6 上调用。

另外,也许您可​​以发布一些代码来更好地说明您是如何转换到这些 viewController 的,这样我们就可以更好地理解视图层次结构。

您可能想查看 UIViewController 的addChildViewController:方法。

于 2013-03-13T21:37:18.217 回答
0

我认为您的最后一个视图可以利用下面编写的代码。它会感知设备的方向,并会为横向视图显示不同的视图控制器(我假设这就是你想要做的)。这意味着您的最后一个视图将具有纵向和横向选项。

@implementation LastViewController

- (void)awakeFromNib
{
isShowingLandscapeView = NO;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                        selector:@selector(orientationLastViewChanged:)
                        name:UIDeviceOrientationDidChangeNotification
                        object:nil];
}
- (void)orientationLastViewChanged:(NSNotification *)notification
{

UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
!isShowingLandscapeView)
{
[self performSegueWithIdentifier:@"LandscapeLastView" sender:self];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
    isShowingLandscapeView)
{
[self dismissViewControllerAnimated:YES completion:nil];
isShowingLandscapeView = NO;

}

}

在通向您希望锁定为纵向的视图的视图控制器上,编写以下代码:

- (BOOL)shouldAutorotate {
return NO;
}

至于您支持的界面方向,请保留它的方式。

于 2013-03-13T21:47:54.780 回答