1

我现在真是一团糟。我使用了执行此操作的苹果示例代码:

  1. 创建纵向视图控制器和横向视图控制器
  2. Potrait 事件控制器然后注册设备方向更改通知
  3. 当设备旋转时,它会为横向视图呈现一个模式视图控制器,或者如果它旋转回纵向则关闭横向视图。
    除了一个小问题之外,一切都正常工作....

现在到我的问题。我用它从表格视图中启动了一个可旋转的视图控制器。它可以旋转并且工作正常。但如果我最初以横向模式启动它,它仍会以纵向模式启动。如果我想要风景,我必须在之后再次将其旋转到风景。我非常努力地解决这个问题但失败了。您可以从Apple Developer Site Here下载并运行示例代码。任何人都可以修复此代码,以便如果在横向模式下启动它会呈现横向视图的模式视图?否则我将不得不重写所有内容以使用单个视图控制器。这些是苹果代码的相关部分:

- (void)viewDidLoad
{
self.view.backgroundColor = [UIColor colorWithRed:197.0/255.0 green:204.0/255.0 blue:211.0/255.0 alpha:1.0];

LandscapeViewController *viewController = [[LandscapeViewController alloc]
                                                initWithNibName:@"LandscapeView" bundle:nil];
self.landscapeViewController = viewController;
[viewController release];

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)
                                                name:UIDeviceOrientationDidChangeNotification object:nil];

}

- (void)orientationChanged:(NSNotification *)notification
{
// We must add a delay here, otherwise we'll swap in the new view
// too quickly and we'll get an animation glitch
[self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView)
{
    [self presentModalViewController:self.landscapeViewController animated:YES];
    isShowingLandscapeView = YES;
}
else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView)
{
    [self dismissModalViewControllerAnimated:YES];
    isShowingLandscapeView = NO;
}    
}

// override to allow orientations other than the default portrait orientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{return (interfaceOrientation == UIInterfaceOrientationPortrait); // support only portrait}
4

2 回答 2

1

我知道这可能与您不再相关,但我刚刚遇到了同样的故障,这是我的解决方案。

从您设置代码的方式(包括 Apple 的设置方式)

- (void)updateLandscapeView

仅在发送通知以告知 ViewController 方向更改时才调用:这里的问题是,这是负责检查其自身方向的方法。(即启动应用程序时不会调用此方法,因此它不会检查设备是否处于任何其他方向)

解决方案非常简单:在启动时强制调用方法,即在 viewDidLoad 中。. .

[self  updateLandscapeView]

这将强制调用该方法并检查接口方向,第一次之后,该方法将在收到更改方向的通知时再次调用

希望这可以帮助外面的人

于 2013-09-03T15:48:55.957 回答
0

除非您仅在设置中指定横向,否则设备似乎采用纵向。您唯一的选择是在您的纵向视图中使用 loadview 方法来检测方向并在启动期间交换视图。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
        {
           if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ) {
        //Load vertical interface
           }
    else
    {
    //load landscape
    }
        }
于 2012-09-28T01:02:01.983 回答