导航控制器弹出子视图后,强制parentView刷新视图

时间:2012-07-18 22:26:14

标签: ios

我有secondViewController,可以在横向和纵向视图中显示内容。 MainViewController(secondViewController的父级)只能以横向模式显示内容。

当SecondView处于纵向模式并弹出时,MainViewController(应该仅以横向模式显示内容)的视图以纵向显示内容。它不会刷新到横向模式。

有没有办法强制MainViewController刷新内容?

在MainViewController的viewWillAppear方法中,我添加了setNeedsDisplay和layoutSubviews等。

-(void) viewWillAppear:(BOOL)animated {
    [self.view setNeedsDisplay];
    [self.view layoutIfNeeded];
    [self.view layoutSubviews];
}

但它没有重新加载视图。我还尝试了导航控制器的委托方法 - willShowViewController,但它无法正常工作。

2 个答案:

答案 0 :(得分:1)

我解决了类似的问题,不让用户“返回”到另一个视图,除非应用程序处于正确的方向(在本例中为Landscape)。你可以做的是提供你自己的“后退”按钮,如果视图是在肖像中,则弹出一个警告,说明请先旋转到横向(或者更好,然后从屏幕的底部或顶部动画一个小视图)。或者只是纵向隐藏或禁用后退按钮(我隐藏了按钮)。

让用户回去是一个糟糕的用户界面选择,并且无论如何在手机处于纵向模式时都能看到横向视图。

答案 1 :(得分:1)

如果您删除视图并将其添加回来,它就会起作用

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (UIDeviceOrientationIsPortrait(orientation)){        
    NSLog(@"force to landscape mode ");
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];
    [view removeFromSuperview];
    [window addSubview:view];        
}

您也可以使用CGAffineTransformMakeRotation,但旋转在导航控制器上不起作用

    if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
        //[self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
    } else if (orientation == UIDeviceOrientationPortrait) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI/2.0)];
        //[self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)];
    }