web-dev-qa-db-ja.com

UIPageViewControllerページコントロールの背景色

私はアプリでUIPageViewControllerを使用していますが、うまく機能しています。ただし、自動的に追加されたページコントロールには、現在のView Controllerの下部マテリアルを隠す黒い背景があります(下図を参照)。 UIPageViewControllerのページコントロールを呼び出して色を変更することは可能ですか?黒ではなく色をクリアするように設定するように、View Controller(例、Pathアプリのウォークスルー)上にページコントロールを表示する必要があります。

enter image description here

42
user1938695

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
}
84
Yas T.

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()
        }
    }
}
27
jlichti

UIPageViewControllerに次のコードを追加します。

- (void)viewDidLoad {
    [super viewDidLoad];
    [[UIPageControl appearance] setPageIndicatorTintColor: [UIColor grayColor]];
    [[UIPageControl appearance] setCurrentPageIndicatorTintColor: [UIColor whiteColor]];
    [[UIPageControl appearance] setBackgroundColor: [UIColor darkGrayColor]];
}
9
Brandon Yang

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

これにより、内部スクロールビューフレームが拡張されます。

8
orkenstein

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()
}
4

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
        }
    }
}
3
AnhSang

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
}
2
Alex

さて、私は実用的なソリューションを見つけました。 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;
       }
   }

}

0
ALiEN