根据方向在XIB中切换视图

时间:2011-05-05 22:43:56

标签: uiview view ios4 landscape

我的XIB中有两个视图用于每个方向。它们相似但不同,所以我不能依赖自动化。我想根据方向切换这些视图。当我使用方法didRotateFromInterfaceOrientation时,当它从Portrait旋转时它将显示横向视图,这在它旋转到PortraitUpsideDown时会出现问题。
如果我修改了willRotateToInterfaceOrientation的代码,那么在LandscapeView中,PortraitView对用户是隐藏的,但是当用户点击按钮时,他们不显示灰色以显示他们被点击,并且应用程序响应,就好像用户点击按钮一样在纵向视图中。

我是否以正确的方式解决这个问题?我需要做些什么来解决这些错误。我更愿意使用方法willRotateToInterfaceOrientation。

谢谢,

CODE:

- (void)viewDidLoad {
... 
    for (UIView *v in self.view.subviews) {
        v.autoresizingMask = UIViewAutoresizingNone;
    }
...
}

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

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

    if(fromInterfaceOrientation == UIInterfaceOrientationPortrait 
       || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        //Add landscape view
        if(![landscapeView superview]){
            for (UIView *v in landscapeView.subviews) {
                v.autoresizingMask = UIViewAutoresizingNone;
            }
            //No effect after testing
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:0.33];
            [self.view addSubview:landscapeView];
            [UIView commitAnimations];
        }
    }else {
        if([landscapeView superview]){
            [landscapeView removeFromSuperview];
        }
    }
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft 
       || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        //Add landscape view
        if(![landscapeView superview]){
            for (UIView *v in landscapeView.subviews) {
                v.autoresizingMask = UIViewAutoresizingNone;
            }
            //No effect after testing
            [UIView beginAnimations:nil context:nil];
            [UIView setAnimationDuration:0.33];
            [self.view addSubview:landscapeView];
            [UIView commitAnimations];
        }
    }else {
        if([landscapeView superview]){
            [landscapeView removeFromSuperview];
        }
}
}

1 个答案:

答案 0 :(得分:0)

在您的视图中加载

[[NSNotificationCenter defaultCenter] addObserver:self
           selector:@selector(willRotateToInterfaceOrientation:)
           name:@"UIDeviceOrientationDidChangeNotification" object:nil];
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) {
        viewControllerName *newView = [[viewControllerName alloc] initWithNibName:nil bundle:nil];
        newView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:newView animated:YES];
        [newView release];

    }

    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) {
        viewControllerName *newView = [[viewControllerName alloc] initWithNibName:nil bundle:nil];
        newView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:newView animated:YES];
        [newView release];

    }

    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait) {
        viewControllerName *newView = [[viewControllerName alloc] initWithNibName:nil bundle:nil];
        newView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:newView animated:YES];
        [newView release];

    }

    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {
        viewControllerName *newView = [[viewControllerName alloc] initWithNibName:nil bundle:nil];
        newView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        [self presentModalViewController:newView animated:YES];
        [newView release];

    }
}