0

我正在实现一个应用程序,其中我使用了几个视图控制器。但是当视图控制器发生变化时,我发现我的应用程序有一个奇怪的行为。让我解释 :

我们在第一个视图控制器中,他的 init 方法是:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

        Menu = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
        self.view.backgroundColor = [UIColor greenColor];
        [self.view addSubview:Menu];
        [Menu release];
    }
    return self;
}

之后,要更改视图控制器并从第一个传递到另一个,我调用此方法:

-(void)GoPlay
{
    if (!parametresviewcontroller)
    {
        parametresviewcontroller = [[ParametresViewController alloc]init];
    }
    UIView *menuView = menuviewcontroller.view;
    UIView *paramView = parametresviewcontroller.view;

    [menuviewcontroller viewWillAppear:NO];
    [parametresviewcontroller viewWillDisappear:NO];
    [menuView removeFromSuperview];
    [self.view addSubview:paramView];
    [menuviewcontroller viewDidAppear:NO];
    [parametresviewcontroller viewDidDisappear:NO];
}

所以调用了第二个viewcontroller的init方法,我把它放在下一个:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization

        Parametres = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
        Parametres.backgroundColor = [UIColor redColor];
        [self.view addSubview:Parametres];
        [Parametres release];
    }
    return self;
}

结果是:

改变的结果

为什么会出现这种奇怪的行为?我真的不明白为什么第一个和第二个之间有差距......谢谢!=)

4

3 回答 3

1

好的,问题是,两个类都是 aUIViewController并且你已经statusbar为两个ViewController'sViewXIB文件中设置了。当您设置 StatusBar 时,视图框架将其 y 更改为下面的 20 像素意味着您已将其设置为 0 但最初它是 20。

因此,当您在执行此设置之前在first的 View 上添加subViewsecond的视图时: secondViewController.view.frame = firstViewController.view.bounds; . 这将解决您的问题。ViewControllerViewController

于 2013-06-11T21:52:49.083 回答
0

我找到了一个解决方案:iPhone 隐藏状态栏将视图向下移动 20 像素

使用 [self setWantsFullScreenLayout:YES]; 在我的例子中,在 init 方法中。

谢谢你们 !

于 2013-06-12T12:54:51.013 回答
0

首先,不要调用viewWillAppear,和你自己,这个方法是由操作系统在生命周期的某些特定点调用的。viewWillDisappearviewDidAppearviewDidDisappearUIViewController

其次,initWithNibName这不是将子视图添加到控制器视图的正确方法,因为您应该使用viewWillAppear,viewDidAppearviewDidLoad.

第三,您所做的changing of view controllers不仅仅是将视图控制器的视图添加到另一个视图控制器视图,以更改UIViewController您应该使用addChildViewController:removeFromParentViewController方法或使用UINavigationController

于 2013-06-11T21:53:31.960 回答