UIPageViewController のページ コントロールを操作できるとは思えません。私の解決策:
UIPageViewControllerDelegate と UIPageViewControllerDataSource である「ルート」UIViewController があります。
このルート ビュー コントローラーには、@property (strong, nonatomic) IBOutlet UIPageControl *pageControl
. 対応するストーリーボード nib で、UIPageControl を追加して配置し、[単一ページの非表示] をオンにします。希望があれば色も変えます。
次に、ルート ビュー コントローラーの viewDidLoad に以下を追加します。self.pageControl.numberOfPages = [self.features count]
私のルートView Controllerにも@property (strong, nonatomic) UIPageViewController *pageViewController
. そして実装では:
self.pageViewController = [[UIPageViewController alloc]
initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
options:nil];
self.pageViewController.delegate = self;
DataViewController *startingViewController = [self viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:NULL];
self.pageViewController.dataSource = self;
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
self.pageViewController.view.frame = CGRectMake(0.0, 0.0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height + 10.0);
[self.pageViewController didMoveToParentViewController:self];
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
(補足: フレームを設定する行により、UIPageViewController のビューの高さが画面サイズを超えて、ネイティブ ページ コントロールが表示されなくなります。私のアプリは縦長のみで、iPhone のみなので、ここで少し簡単に始めました。回転を処理する必要がある場合は、そのネイティブ ページ コントロールを画面外に保持する方法を見つける必要があります。オーバーライドする方法を見つけてください。)
とにかく...次に、追加の UIPageViewController デリゲート メソッドを追加して、新しい非ネイティブ UIPageControl を現在選択されているページに変更します。
- (void)pageViewController:(UIPageViewController *)viewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (!completed){return;}
// Find index of current page
DataViewController *currentViewController = (DataViewController *)[self.pageViewController.viewControllers lastObject];
NSUInteger indexOfCurrentPage = [self indexOfViewController:currentViewController];
self.pageControl.currentPage = indexOfCurrentPage;
}
私が望むほどきれいではありませんが、このクラスの Apple の API は正確にはエレガンスには向いていません。