私はアプリでUIPageViewControllerを使用していますが、うまく機能しています。ただし、自動的に追加されたページコントロールには、現在のView Controllerの下部マテリアルを隠す黒い背景があります(下図を参照)。 UIPageViewControllerのページコントロールを呼び出して色を変更することは可能ですか?黒ではなく色をクリアするように設定するように、View Controller(例、Pathアプリのウォークスルー)上にページコントロールを表示する必要があります。
appearance
を使用して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
}
Swift向けに更新:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for view in self.view.subviews {
if view is UIScrollView {
view.frame = UIScreen.main.bounds
} else if view is UIPageControl {
view.backgroundColor = UIColor.clear
}
}
}
必要な人のためのSwift 2の例。これをUIPageControllerサブクラス内に配置します。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for view in self.view.subviews {
if view is UIScrollView {
view.frame = UIScreen.mainScreen().bounds
} else if view is UIPageControl {
view.backgroundColor = UIColor.clearColor()
}
}
}
UIPageViewControllerに次のコードを追加します。
- (void)viewDidLoad {
[super viewDidLoad];
[[UIPageControl appearance] setPageIndicatorTintColor: [UIColor grayColor]];
[[UIPageControl appearance] setCurrentPageIndicatorTintColor: [UIColor whiteColor]];
[[UIPageControl appearance] setBackgroundColor: [UIColor darkGrayColor]];
}
UIPageViewControllerをサブクラス化し、次のコードを追加します。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
for (UIView *view in self.view.subviews) {
if ([view isKindOfClass:[NSClassFromString(@"_UIQueuingScrollView") class]]) {
CGRect frame = view.frame;
frame.size.height = view.superview.frame.size.height;
view.frame = frame;
}
}
}
これにより、内部スクロールビューフレームが拡張されます。
Swift 2+バージョンの Yas-T の回答
//In AppDelegate
let pageControl = UIPageControl.appearance()
pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
pageControl.currentPageIndicatorTintColor = UIColor.blackColor()
pageControl.backgroundColor = UIColor.blueColor()
//Or in your ViewController (Only available on IOS 9.0)
if #available(iOS 9.0, *) {
let pageControl = UIPageControl.appearanceWhenContainedInInstancesOfClasses([ViewController.self])
pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor()
}
PageViewControllerの関数viewDidLayoutSubviews()
をオーバーライドします。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for view in view.subviews{
if view is UIScrollView{
view.frame = UIScreen.main.bounds
}else if view is UIPageControl{
view.backgroundColor = UIColor.clear
}
}
}
Swift 3 +受け入れられた回答のバージョン(作成されたカスタムカラーのプラス付き)は次のとおりです。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 9.0, *) {
let pageControl = UIPageControl.appearance(whenContainedInInstancesOf: [UIPageViewController.self])
pageControl.pageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 0.4)
pageControl.currentPageIndicatorTintColor = UIColor.init(colorLiteralRed: 43/255.0, green: 170/255.0, blue: 226/255.0, alpha: 1.0)
}
return true
}
さて、私は実用的なソリューションを見つけました。 UIPageViewController内に、次のコードを追加するだけです。
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:UIScrollView.class])
{
CGRect frame = view.frame;
frame.size.height = view.superview.frame.size.height;
view.frame = frame;
}
if ([view isKindOfClass:UIPageControl.class])
{
CGFloat newHeight = 22;
CGRect frame = view.frame;
frame.Origin.y += frame.size.height - newHeight;
frame.size.height = newHeight;
view.frame = frame;
view.backgroundColor = UIColor.darkGrayColor;
view.alpha = 0.3;
}
}
}