web-dev-qa-db-ja.com

UIPageViewControllerのページインジケーターをカスタマイズできますか?

今では、背景が黒の白い点になっています。白い背景の黒い点にしたい場合はどうですか?

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0)
{
    return _imageArrays.count;
}// The number of items reflected in the page indicator.
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0)
{
    return self.intCurrentIndex;
}// The selected item reflected in the page indicator.
43
Septiadi Agus

UIPageViewControllerのページコントロールを操作できるとは思わない。私の解決策:

UIPageViewControllerDelegateとUIPageViewControllerDataSourceである「ルート」UIViewControllerがあります。

このルートビューコントローラーには、@property (strong, nonatomic) IBOutlet UIPageControl *pageControlがあります。対応するストーリーボードのペン先で、UIPageControlを追加して配置し、「単一ページの非表示」をチェックします。必要に応じて、色を変更することもできます。

次に、ルートビューコントローラーのviewDidLoadに以下を追加します。_self.pageControl.numberOfPages = [self.features count]_

ルートビューコントローラーにも@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;
_

(SIDE NOTE:フレームを設定する行により、UIPageViewControllerのビューの高さが画面サイズを超えて、ネイティブページコントロールが表示されなくなります。私のアプリはポートレートのみ、iPhoneのみです。回転を処理する必要がある場合は、そのネイティブページコントロールを画面外に保持する方法を見つける必要があります。自動レイアウトを使用してみましたが、UIPageViewControllerは、一連の自動レイアウトマスク制約を持つマジックビューを作成しました。オーバーライドする方法を見つけます。)

とにかく...その後、追加の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は正確に優雅にはなりません。

33
sirvine

UIAppearanceを使用して、UIPageControlの色を変更できます。 AppDelegateのdidFinishLaunchingWithOptions関数でこれを試してください。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControl.backgroundColor = [UIColor blueColor];

    return YES;
}

編集:

特定のView Controllerにのみスタイルを適用するには、次のように代わりにappearanceWhenContainedInを使用します。

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];

これで、UIPageControlに含まれるMyViewControllerオブジェクトのみがこのスタイルに適応します。

マイクとシンゴーに感謝します!

編集:画面の下部にUIPageControlの周りに黒い背景が表示される場合、UIPageViewControllerではなくUIPageControlの背景色が原因です。 。この色は次のように変更できます。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blueColor]; //Set it to whatever you like
}
129
Yas T.

実際にそれを取得し、デリゲート呼び出しの1つで独自のプロパティにローカルに保存できます。

UIPageViewController内のUIPageControlにアクセスするには、デリゲート内に次のコードを配置します。

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    [self setupPageControlAppearance];
    return kPageCount;
}

- (void)setupPageControlAppearance
{
    UIPageControl * pageControl = [[self.view.subviews filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(class = %@)", [UIPageControl class]]] lastObject];
    pageControl.pageIndicatorTintColor = [UIColor grayColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
}
6
Yariv Nissim

サブビューで再帰的に検索できます

- (void)findAndConfigurePageControlInView:(UIView *)view
{
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UIPageControl class]]) {
            UIPageControl * pageControl = (UIPageControl *)subview;
            //customize here
            pageControl.hidesForSinglePage = YES;
            break;
        } else {
            [self findAndConfigurePageControlInView:subview];
        }
    }
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    [self findAndConfigurePageControlInView:self.view];
    return self.promotionsVCs.count;
}

わたしにはできる

4
CyberKid
UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
pageControl.backgroundColor = [UIColor blackColor];

これにより、「MyViewController」の外観が変更されます。同じビューの異なるページインジケータで異なる色を使用する場合は、異なるサブビューを作成し、個別にカスタマイズする必要があります。

2
Shingoo

Swift 4.で行ったことを次に示します。最初にviewDidLoadで同様の回答を試しましたが、これが最終的にはうまくいきました。この同じスニペットを使用して、同様のSOの質問に答えました。

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    for view in self.view.subviews{
        if view is UIPageControl{
            (view as! UIPageControl).currentPageIndicatorTintColor = .yellow
            }
        }
    }

このブロックにUIPageControlがあれば、インジケーターの色をカスタマイズできるはずです。

1
wsgeorge

外観からカスタマイズできます。このようにAppDelegateで実行できます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   UIPageControl *pageControl = [UIPageControl appearance];
   pageControl.pageIndicatorTintColor = [UIColor whiteColor];
   pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
   pageControl.backgroundColor = [UIColor lightGrayColor];

   return YES;
}

特定のView Controllerに対してのみ行う場合は、代わりにpageControlをこれに置き換えます。

UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
1
Zeezer

これはカスタム画像に最適です

self.pageControl.pageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater"]];

self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater_selection"]];

UIPageViewControllerによって作成された「自動生成」ページインジケーターを使用する場合、カスタマイズできないと思います。それを行う唯一の方法は、追加のPageControlを追加することです。これは、Appleによって提供されるもの、または@Maschelが提案したカスタムのもののいずれかです。

1
Heckscheibe

次のような計算プロパティを定義することで、UIPageViewControllerpageControlに簡単にアクセスできます。

var pageControl: UIPageControl? {
    for subview in view.subviews {
        if let pageControl = subview as? UIPageControl {
            return pageControl
        }
    }
    return nil
}

そして、次のようにニーズに合わせてカスタマイズします。

override func viewDidLoad() {
    super.viewDidLoad()
    pageControl?.backgroundColor = .white
    pageControl?.pageIndicatorTintColor = .red
    pageControl?.currentPageIndicatorTintColor = .blue
}

明らかな警告:if AppleがUIPageViewControllerビュー階層を変更することを決定すると、これは機能しなくなります。

0
boliva

SMPageControlを使用できます: Github 。 UIPageControlと同じように機能しますが、より多くのカスタマイズの可能性があります。

0
Maschel