我有一个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已正确加载但它们不会显示,页面也不会更改。
有人能解释我发生了什么吗?
谢谢。 升。
答案 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
。