web-dev-qa-db-ja.com

UIPageViewControllerの下部ギャップを削除する方法

UIPageViewControllerを使用して画像を全画面表示していますが、UIPageControllerにサブビュー/子として追加されたUIViewControllerには、ImageViewを使用して表示されている画像があります。問題は、画像がフルスクリーンで表示されないことです。代わりに、ページコントロールビューのドンが下部に表示され、そのスペースが完全に無駄になります。添付画像をご確認ください。

enter image description here

これがコードです

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は、それが重要な場合はストーリーボードの一部です。

13

ついに自分で解決策を得ました。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);
39

奇妙な。 docs 言う:

「ページインジケーターのサポート」の両方のメソッドが実装されていて、ページビューコントローラーの遷移スタイルがUIPageViewControllerTransitionStyleScrollの場合、ページインジケーターが表示されます。

これらの2つの方法は次のとおりです。

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { 
}

これらの2つのデータソースメソッドを実装していますか?もしそうなら、おそらくそれらを削除した場合、手動でページコントロール(ドット)を削除する必要はありませんか?簡単なテストは、

UIPageViewControllerTransitionStyleScroll

UIPageViewControllerTransitionStylePageCurl

ページコントロールインジケータのドットが消えるかどうかを確認します。 (もちろん、hideメソッドをコメントアウトした後。)

21
Michael J.

UIPageViewControllerドットは、次のメソッドを実装した場合にのみ表示されます。

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController;

コードをチェックインします。また、このメソッドでゼロを返すと、ドットが非表示になります(UIPageControl)

14
g.revolution

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
    }
}
5
ZaEeM ZaFaR

Swiftバージョン:)。 UIPageViewControllerサブクラス内の以下の実装ではゼロを返します。 func presentCountForPageViewController(pageViewController:UIPageViewController)-> Int {return 0}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }
1
deepax11

以下のコードをUIPageViewControllerに貼り付けます。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if let pageScrollView = view.subviews.first {
        pageScrollView.frame = view.bounds
    }
}
0
Konrad Siemczyk

ポケットベルコントローラをそのように設定します

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

これで、下部のスペースのギャップが削除され、ページコントロールは表示されません:)

0
SMS