iPhone在navigationViewController模式下旋转视图

时间:2011-03-11 03:19:18

标签: iphone uinavigationcontroller rotation

小时前我发布了一个关于在iPhone中组织纵向和横向模式的问题,现在我想我知道如何使用willRotateToInterfaceOrientation:duration。

第一个屏幕是“地图视图”,其中一个按钮指向“设置视图”。地图视图不支持旋转,但对于设置视图我为纵向和横向创建了单独的视图,并且在旋转时它们会相应地交换。

enter image description hereenter image description hereenter image description here

正如您所看到的那样,按下设置按钮时,ViewView会像往常一样添加到视图堆栈中。所以基本上我使用三个视图控制器;设置,SettingLandscape和SettingPortrait。

当我使用navigationViewController时,我仍然在iPhone中旋转视图时遇到问题。 分段控件不起作用。它崩溃而没有错误消息。它曾经工作正常而没有旋转.-当我没有使用多个视图进行旋转时。

rotateViewController.m

这是根视图控制器。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return YES;

}

-(IBAction) buttonPressed{
Setting *settingViewController = [[Setting alloc] initWithNibName:@"Setting" bundle:[NSBundle mainBundle]];
UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController: settingViewController];
[self.navigationController presentModalViewController:navController1 animated:YES];
[settingViewController release];
[navController1 release];

}

Setting.m

此视图控制器在旋转时只执行交换视图,并在纵向和横向之间显示适当的视图。

在Setting.m中,我按如下方式交换视图;

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
    NSLog(@"to Right");
    SettingLandscape *setting_landscape = [[SettingLandscape alloc] initWithNibName:@"SettingLandscape" bundle:[NSBundle mainBundle]];
    self.view = setting_landscape.view;
    [setting_landscape release];
}
 if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
     NSLog(@"to Left");
     SettingLandscape *setting_landscape = [[SettingLandscape alloc] initWithNibName:@"SettingLandscape" bundle:[NSBundle mainBundle]];
     self.view = setting_landscape.view;
     [setting_landscape release];
 }
if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
    NSLog(@"to Portrait");
    SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
    self.view = settingportrait.view;
    [settingportrait release];
}
if (toInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) {
    NSLog(@"to PortraitUpsideDown");
    SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
    self.view = settingportrait.view;
    [settingportrait release];
}

}

在viewWillAppear中,设置视图控制器也有;

self.title = @"Shell ";
self.navigationController.navigationBarHidden = NO; 
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(Done)] autorelease];

和Done是

- (void) Done{
[self dismissModalViewControllerAnimated:YES];  

}

SettingLandscape.m

此视图在旋转视图时堆叠在一起。这个视图控制器有它的导航栏。

 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     self.title = @"Setting Landscape";

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;

}

在viewDidLoad;

- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"landscape:viewDidLoad");
//self.title = @"SettingLandscape";//not working!!
//self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Done1" style:UIBarButtonItemStylePlain target:self action:@selector(Done)] autorelease];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
stringflag4MapType = [[NSString alloc] initWithString:@"blah"];
stringflag4MapType = [defaults stringForKey:@"flag4MapType"];
if (![stringflag4MapType isEqualToString:@"Hybrid"] && ![stringflag4MapType isEqualToString:@"Standard"] && ![stringflag4MapType isEqualToString:@"Satellite"]) {
    segmentedControl4MapType.selectedSegmentIndex = 0;
}else if ([self.stringflag4MapType isEqualToString:@"Standard"]) {
    segmentedControl4MapType.selectedSegmentIndex = 0;
}else if ([self.stringflag4MapType isEqualToString:@"Satellite"]) {
    segmentedControl4MapType.selectedSegmentIndex = 1;
}else if ([self.stringflag4MapType isEqualToString:@"Hybrid"]) {
    segmentedControl4MapType.selectedSegmentIndex = 2;

}

并且不会调用以下调用。奇怪。无论如何旋转都无关紧要。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
    NSLog(@"to Portrait");// does not print out.
    SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
    self.view = settingportrait.view;
    [settingportrait release];

}
if (toInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) {
    NSLog(@"to PortraitUpsideDown");
    SettingPortrait *settingportrait = [[SettingPortrait alloc] initWithNibName:@"SettingPortrait" bundle:[NSBundle mainBundle]];
    self.view = settingportrait.view;
    [settingportrait release];

}

}

现在好了,正如你可以从那些快照中看到的那样,有两个导航栏,每个都有它的栏按钮,Done和Item。完成按钮来自Setting和来自SettingPortrait或SettingLandscape的项目按钮。所有按钮的选择器都相同,可以返回到地图视图。按钮Done工作正常,但按钮项目崩溃。旋转后我需要一个导航栏上的按钮,就像后退按钮一样。我想曾经做过'self.view = settingportrait.view;'问题开始了。

我需要Item按钮工作的原因是,一旦我添加代码以支持旋转,分段控件就会崩溃。如果我找到理由如何制作项目按钮 - 这是旋转内部视图 - 我认为我也可以使分段控制工作。

您可以在https://github.com/downloads/bicbac/rotation-test/rotate-1.zip

下载整个代码

2 个答案:

答案 0 :(得分:1)

https://github.com/downloads/bicbac/rotation-test/rotate-1.zip 这个示例代码对我来说太棒了。它只是通过简单的委托方法

来解决我的旋转视图的问题
  • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 返回YES; }

答案 1 :(得分:0)

  • 我最好尝试不用看代码来回答问题(今晚没有时间:()

当您以模态方式呈现设置viewcontroller时,您的顶级viewcontroller正在设置。

当旋转发生时,您加载setting_landscape或setting_portrait viewcontroller,但只保留setting_landscape | portrait内的视图。因此,setting_landscape / portrait viewcontrollers 已发布。当设备旋转时,它可能是“设置”视图控制器接收旋转消息,而不是“setting_landscape / portrait”视图控制器,因为它们没有被推到视图控制器堆栈。

因此,当您单击项目或段控件时,它将调用委托,该委托可能已设置为已发布的<_>已设置的<_p>。

崩溃后控制台中的消息是什么?

我的建议是使用分段控件构建设置viewcontroller,然后使用“willAnimateRotationToInterfaceOrientation:duration:”函数将分段控件重新定位到正确的位置和帧。只需将YES返回到所有方向,就应该支持旋转,不是吗?

使用两个单独的viewcontroller进行横向/纵向的原因是什么? (我有时这样做,但很少)

编辑*您需要使用“willAnimateRotationToInterfaceOrientation”回调来动画更改,而不是“willRotate ...”