整天都在这个令人头疼的主要问题:-(
我有一个 UIPageViewController 的实例,它似乎没有触发委托方法:
-(UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController
spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
我已经尝试了各种显示 UIPageViewController 的方法,并且已经确定了一种似乎可以正常工作的编程方法(而不是 Storyboard 方法),但有一个例外......当将 iPad 旋转为横向时,脊柱不会出现在中间点如预期。我根本无法找出为什么没有调用委托方法。
代码说明(例如简化)
考虑如下三个类:
- RootViewController - 应用启动时加载
- PageViewController - 在用户启动时由 RootViewController 加载
- PageContentViewController - 需要页面时由 PageViewController 加载
相当不言自明。RootViewController 由应用程序在启动时加载。当用户在此视图控制器的视图中点击图像时(想想杂志封面打开杂志),它会启动 PageViewController,如下所示:
PageViewController *pvc = [[PageViewController alloc] initWithNibName:@"PageView"
bundle:[NSBundle mainBundle]];
pvc.view.frame = self.view.bounds;
[self.view addSubview:pvc.view];
在实际的应用程序中,有动画等使过渡效果很好,但本质上是 PageViewController 的视图已加载并采用全屏显示。
页面视图控制器
这是主力(仅显示相关方法)。我尝试了来自 Google 无限世界的各种示例,并直接从 Apple 文档中编写...
@interface PageViewController : UIViewController <UIPageViewControllerDelegate, UIPageViewControllerDataSource>
@property (nonatomic, strong) UIPageViewController *pageViewController;
@property (nonatomic, strong) NSMutableArray *modelArray;
@end
@implementation TXCategoryController
-(void)viewDidLoad
{
[super viewDidLoad];
// Simple model for demo
self.modelArray = [NSMutableArray alloc] init];
for (int i=1; i<=20; i++)
[self.modelArray addObject:[NSString stringWithFormat:@"Page: %d", i]];
self.pageViewController = [[UIPageViewController alloc]
initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;
PageContentViewController *startupVC = [[PageContentViewController alloc] initWithNibName:@"PageContent" bundle:nil];
startupVC.pageLabel = [self.modelArray objectAtIndex:0];
[self.pageViewController setViewControllers:[NSArray arrayWithObject:startupVC]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
self.pageViewController.view.frame = self.view.bounds;
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController
{
// Relevant code to add another view...
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController
{
// Relevant code to add another view...
}
-(UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController
spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
// Setting a break point in here - never gets called
if (UIInterfaceOrientationIsPortrait(orientation))
{
// Relevant code to create view...
return UIPageViewControllerSpineLocationMin;
}
// Relevant code to create 2 views for side-by-side display and
// set those views using self.pageViewController setViewControllers:
return UIPageViewControllerSpineLocationMid
}
@end
正如我之前提到的,这一切都很好。PageViewController 的视图被显示出来。我可以纵向和横向左右滑动页面,并显示相应的页码。但是,我从来没有在横向视图中看到两个页面并排。在 spinLocationForInterfaceOrientation 委托方法中设置断点永远不会被调用。
这是一个令人头疼的问题,我已经耗尽了关于如何调试/解决问题的想法。它的行为几乎就像 UIPageViewController 没有响应设备的方向变化,因此没有触发委托方法。但是,视图会正确调整大小(但这可能只是处理该更改的 UIView 自动调整大小掩码)。
如果我只用这段代码(和适当的 XIb 等)创建一个全新的项目,它工作得非常好。所以我实际项目中的某个地方导致了这种情况。我不知道在哪里继续寻找。
像往常一样,非常感谢任何和所有帮助。
边注
我想添加标签“uipageviewcontrollerspinelocation”但不能,因为它太长而且我没有足够的声誉(需要 1500)。我认为这是 Apple 为避免 Stackoverflow 中的某些标签而采取的一种狡猾的策略...... ;-)