今では、背景が黒の白い点になっています。白い背景の黒い点にしたい場合はどうですか?
- (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.
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は正確に優雅にはなりません。
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
}
実際にそれを取得し、デリゲート呼び出しの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];
}
サブビューで再帰的に検索できます
- (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;
}
わたしにはできる
UIPageControl *pageControl = [UIPageControl appearanceWhenContainedIn:[MyViewController class], nil];
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
pageControl.backgroundColor = [UIColor blackColor];
これにより、「MyViewController」の外観が変更されます。同じビューの異なるページインジケータで異なる色を使用する場合は、異なるサブビューを作成し、個別にカスタマイズする必要があります。
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があれば、インジケーターの色をカスタマイズできるはずです。
外観からカスタマイズできます。このように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];
これはカスタム画像に最適です
self.pageControl.pageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater"]];
self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"page_indicater_selection"]];
UIPageViewControllerによって作成された「自動生成」ページインジケーターを使用する場合、カスタマイズできないと思います。それを行う唯一の方法は、追加のPageControlを追加することです。これは、Appleによって提供されるもの、または@Maschelが提案したカスタムのもののいずれかです。
次のような計算プロパティを定義することで、UIPageViewController
のpageControl
に簡単にアクセスできます。
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
ビュー階層を変更することを決定すると、これは機能しなくなります。
SMPageControlを使用できます: Github 。 UIPageControlと同じように機能しますが、より多くのカスタマイズの可能性があります。