1

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

编辑。这是 viewDidAppear:(BOOL)animated 中的子视图设置

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];
}

发生了一些奇怪的事情:我无法再更改页面,或者更好的是,上一个和下一个 viewController 已正确加载,但它们没有显示,页面也没有改变。

有人可以解释一下发生了什么吗?

谢谢你。L.

4

2 回答 2

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 选择器会弄乱数据源并导致奇怪的崩溃。

于 2012-08-06T09:12:59.313 回答
0

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

解决此问题的一种简单方法是:

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

让我知道这个是否奏效。

无论如何,我发现您在viewWillAppear. IMO,正确的地方是viewDidLoad

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

于 2012-08-04T09:50:35.973 回答