UIPageViewController在旋转后将子视图带到前面

时间:2012-08-03 16:36:49

标签: iphone ios5 rotation subview uipageviewcontroller

我有一个UIPageViewController,其中我添加了两个子视图:带有UITapGestureRecognizer的透明子视图和带有一些按钮的工具栏,当我点击其他子视图时,这些按钮从底部向上滑动。

EDIT。 这是viewDidAppear中的子视图设置:(BOOL)动画

CGRect frame;
if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice]orientation])){
    frame = CGRectMake(50, 0, 220, 480);
}
else {
    frame = CGRectMake(50, 0, 380, 320);
}
if (!tapView) {
    tapView = [[LSTapView alloc]initWithFrame:frame];
    //[tapView setBackgroundColor:[UIColor colorWithRed:1 green:0 blue:0 alpha:0.4]];
    [self.view addSubview:tapView];
    [tapView release]; 
}
else {
    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice]orientation])){
        [tapView setFrame:CGRectMake(50, 0, 220, 480)];
        [fontViewController.view setFrame:CGRectMake(0, 480, 320, 92)];
    }
    else {
        [tapView setFrame:CGRectMake(50, 0, 380, 320)];
        [fontViewController.view setFrame:CGRectMake(0, 320, 480, 92)];

    }
}

if (!fontViewController){
    fontViewController = [[LSFontViewController alloc]initWithNibName:@"LSFontView" bundle:nil];
}
if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice]orientation])){
    [fontViewController.view setFrame:CGRectMake(0, 480, 320, 92)];
}
else {
    [fontViewController.view setFrame:CGRectMake(0, 320, 480, 92)];
}

[self.view addSubview:fontViewController.view];

如果我在不旋转设备的情况下更改页面,则两个方向的一切都能正常工作。然而,当我旋转设备时,这两个子视图消失了,我发现它们不在前面。无论如何,如果我将其添加到我的代码中:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [self.view bringSubviewToFront:tapView];
    [self.view bringSubviewToFront:fontViewController.view];
}
发生了一些奇怪的事情:我无法再更改页面,或者更好,前一个和下一个viewControllers已正确加载但它们不会显示,页面也不会更改。

有人能解释我发生了什么吗?

谢谢。 升。

2 个答案:

答案 0 :(得分:1)

我通过将UIPageViewController注册到UIDeviceOrientationDidChangeNotification来解决了这个问题:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation) name:UIDeviceOrientationDidChangeNotification object:nil];

并添加这个简单的选择器:

-(void)didChangeOrientation{
    [self.view bringSubviewToFront:tapView];
    [self.view bringSubviewToFront:fontViewController.view];
}

由于某些原因我真的不知道和理解,didRotateFromInterfaceOrientation选择器的简单添加搞砸了数据源并导致奇怪的崩溃..

答案 1 :(得分:0)

您的问题应该与在iOS 5下旋转设备后未自动调用viewWillAppear的事实有关。因此,当您旋转设备时,您编码以重新排列子视图的框架不是执行。我不知道这是iOS 5中的错误,还是iOS 5的某个特定次要版本中的错误,但几周前我发现了这个错误,并且在自动旋转的情况下也破坏了我的逻辑。

解决这个问题的一个简单方法是:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
   [self viewWillAppear:NO];
}

让我知道这是否有效。

无论如何,我发现你在viewWillAppear实例化你的观点时感到非常困惑。 IMO,正确的地方是viewDidLoad

我的建议是在viewDidLoad中处理子视图创建的逻辑,然后在一个单独的方法中处理视图定位的逻辑,让我们称之为layoutSubviews,你可以从{{{}}调用它们。 1}}和viewDidLoad