UIPageViewControllerを使用して画像を全画面表示していますが、UIPageControllerにサブビュー/子として追加されたUIViewControllerには、ImageViewを使用して表示されている画像があります。問題は、画像がフルスクリーンで表示されないことです。代わりに、ページコントロールビューのドンが下部に表示され、そのスペースが完全に無駄になります。添付画像をご確認ください。
これがコードです
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
NewsItemViewController *initialViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];
ここで、NewsItemViewControllerは画像と一部のテキストを表示するUIViewControllerであり、MainViewControllerはUIPageViewControllerDataSourceプロトコルとMainViewControllerに必要なメソッドを実装しています。
全画面で表示する方法が必要だと思います。
***また、MainViewControllerは、それが重要な場合はストーリーボードの一部です。
ついに自分で解決策を得ました。UIViewPageControllerからページコントロールを非表示にしてから、UIPageViewControllerのサイズを拡張して、ページコントロールがないために残ったギャップを埋めました。
NSArray *subviews = self.pageController.view.subviews;
UIPageControl *thisControl = nil;
for (int i=0; i<[subviews count]; i++) {
if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) {
thisControl = (UIPageControl *)[subviews objectAtIndex:i];
}
}
thisControl.hidden = true;
self.pageController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+40);
奇妙な。 docs 言う:
「ページインジケーターのサポート」の両方のメソッドが実装されていて、ページビューコントローラーの遷移スタイルがUIPageViewControllerTransitionStyleScrollの場合、ページインジケーターが表示されます。
これらの2つの方法は次のとおりです。
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
}
これらの2つのデータソースメソッドを実装していますか?もしそうなら、おそらくそれらを削除した場合、手動でページコントロール(ドット)を削除する必要はありませんか?簡単なテストは、
UIPageViewControllerTransitionStyleScroll
に
UIPageViewControllerTransitionStylePageCurl
ページコントロールインジケータのドットが消えるかどうかを確認します。 (もちろん、hideメソッドをコメントアウトした後。)
UIPageViewControllerドットは、次のメソッドを実装した場合にのみ表示されます。
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController;
コードをチェックインします。また、このメソッドでゼロを返すと、ドットが非表示になります(UIPageControl)
Swift 2.2互換コードを追加しています
for view in self.view.subviews {
if view.isKindOfClass(UIScrollView) {
view.frame = UIScreen.mainScreen().bounds
} else if view.isKindOfClass(UIPageControl) {
view.backgroundColor = UIColor.clearColor()
}
}
これはSwift 4互換ソリューションであり、viewDidLayoutSubviews
に埋め込まれています
for view in self.view.subviews {
if view.isKind(of:UIScrollView.self) {
view.frame = UIScreen.main.bounds
} else if view.isKind(of:UIPageControl.self) {
view.backgroundColor = UIColor.clear
}
}
Swiftバージョン:)。 UIPageViewControllerサブクラス内の以下の実装ではゼロを返します。 func presentCountForPageViewController(pageViewController:UIPageViewController)-> Int {return 0}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }
以下のコードをUIPageViewControllerに貼り付けます。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let pageScrollView = view.subviews.first {
pageScrollView.frame = view.bounds
}
}
ポケットベルコントローラをそのように設定します
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];
そして実装すると、このメソッドは1より大きい値を返す必要があります
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
// The selected item reflected in the page indicator.
return 2;
}
これで、下部のスペースのギャップが削除され、ページコントロールは表示されません:)