仅在Tabbar-Application(横向纵向)中的一个选项卡上更改视图?

时间:2010-02-08 16:29:58

标签: iphone uitabbarcontroller landscape

旋转iphone时如何更改视图(更改笔尖)。 但它应该只在一个标签中发生! 我尝试过:

    - (void)viewDidLoad {
 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
{
    [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;
    }    
}

但是景观视图会出现在所有标签中。 (当此代码加载一次时)。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

当旋转发生变化时,视图控制器正在接收UIDeviceOrientationDidChangeNotification通知,无论是否正在显示。而是尝试使用UIViewController的内置方法来响应旋转。

http://tinyurl.com/ycb8of2

答案 1 :(得分:0)

这是来自Apple的文档(View Controller Programming Guide):

  

标签栏控制器和视图旋转

     

标签栏控制器支持纵向   默认情况下方向,不要   旋转到横向   除非所有的根视图   控制器支持这样的   取向。当设备方向   更改发生,标签栏控制器   查询其视图控制器数组。   如果他们中的任何一个不支持   方向,标签栏   控制器不会改变它   取向。

所以,我不确定标签栏控制器是否只针对单个视图进行旋转。

答案 2 :(得分:0)

坦克为您的评论! 我找到了一个解决方法:

//Remove Observer if not in Landscape
- (void)viewDidDisappear:(BOOL)animated {
    if (isShowingLandscapeView == NO) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
    }   
}

//Add Observer if not in Landscape
- (void)viewDidAppear:(BOOL)animated {
    if (isShowingLandscapeView == NO) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
    }
}