UIPageViewController 页面控件背景颜色

Posted

技术标签:

【中文标题】UIPageViewController 页面控件背景颜色【英文标题】:UIPageViewController page control background color 【发布时间】:2013-08-23 17:10:00 【问题描述】:

我在我的应用程序中使用 UIPageViewController,它工作正常。然而,它是自动添加的页面控件有一个黑色背景,它隐藏了当前视图控制器的底部材质(见下图)。是否可以调用 UIPageViewController 的页面控件并更改其颜色?我希望页面控件显示在视图控制器上(例如,Path 应用程序的演练),例如设置颜色而不是黑色来清除。

【问题讨论】:

这些可能会有所帮助。 ***.com/questions/17684922/…***.com/questions/17466718/… 【参考方案1】:

您可以使用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;

要将样式仅应用于特定的视图控制器,您可以使用appearanceWhenContainedIn,如下所示:

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

只有MyViewController 中包含的UIPageControl 对象才会获得这种样式。

编辑: 屏幕底部UIPageControl 周围的黑色背景是由于UIPageViewController 而不是UIPageControl 的背景颜色。您可以按如下方式更改此颜色:

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

【讨论】:

谢谢,但它实际上无法使其透明,以便我可以显示它下面的内容([uicolor clearcolor])。然而,这是一条有价值的信息。我有一个问题,希望你能给我更多的信息。它如何知道我的目标是哪个 pageControl?外观如何工作?非常感谢! @user1938695 如果你想让它是透明的,把他代码的最后一行改成:pageControl.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.5f]; 这让我很接近,但我仍然无法让背景变得透明。 @Pork'n'Bunny - pageControl.backgroundColor = [UIColor clearColor]; 不适合你吗? 这是因为您的UIPageControllerView 视图没有颜色,基本上显示为黑色。将此添加到您的UIPageViewControllerviewDidLoad: 函数中以将黑色更改为红色。 self.view.backgroundColor = [UIColor redColor];【参考方案2】:

Swift 3 更新:

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

【讨论】:

嗨@Imran - 上面 orkenstein 的 objC 代码基本相同。我只是在这里为其他人提供一个快速的例子。 哪个部分不工作?除非您更好地解释您的问题,否则我无能为力。您也可以很容易地将此​​代码移植到 ObjC。 对我来说它有效。我只是将 view.frame = UIScreen.mainScreen().bounds 更改为 view.frame = self.view.bounds 对我来说,这个 swift 版本可以工作,但它也将页面控制器指示器设置为清除...有什么方法可以显示指示器吗?或者改变它们的颜色? 它在 Swift 3.0 / XCode 8.3 上对我有用。 ios 10.3.1。我不得不在“UIPageViewController”中添加这个方法。在我的 ContentViewController 中不小心添加了它。【参考方案3】:

在 UIPageViewController 中添加以下代码。

- (void)viewDidLoad 
    [super viewDidLoad];
    [[UIPageControl appearance] setPageIndicatorTintColor: [UIColor grayColor]];
    [[UIPageControl appearance] setCurrentPageIndicatorTintColor: [UIColor whiteColor]];
    [[UIPageControl appearance] setBackgroundColor: [UIColor darkGrayColor]];

【讨论】:

【参考方案4】:

只需继承 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;
    
  

这将扩展内部滚动视图框架。

【讨论】:

必须添加 [self.view sendSubviewToBack:view];在 if 语句中让它在这里正常工作。 当我点击它滚动到下一页时,这会使我的视图“跳跃”。我不知道如何解决这个问题。 这不使用私有API吗?【参考方案5】:

这里是 Swift 2+ 版本的Yas-T's Answer

//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()

【讨论】:

仅适用于 iOS 9.0。【参考方案6】:

这是接受的答案的 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

【讨论】:

【参考方案7】:

重写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
        
    

【讨论】:

【参考方案8】:

嗯,我找到了一个可行的解决方案。在您的 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;
       
   

【讨论】:

【参考方案9】:

查看我的设置方法的代码,其中我更改了页面视图控制器的页面控件颜色,它对我有用。

private func setupPageController() 

    self.pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
    self.pageController?.dataSource = self
    self.pageController?.delegate = self
    self.pageController?.view.backgroundColor = .clear
    self.pageController?.view.frame = CGRect(x: 0,y: 0,width: self.view.frame.width,height: self.view.frame.height)
    self.addChild(self.pageController!)
    self.view.addSubview(self.pageController!.view)

    for item in self.pageController?.view?.subviews ?? []
        if item is UIPageControl
            (item as! UIPageControl).pageIndicatorTintColor = #colorLiteral(red: 0.501960814, green: 0.501960814, blue: 0.501960814, alpha: 1)
            (item as! UIPageControl).currentPageIndicatorTintColor = #colorLiteral(red: 1, green: 0.7489039302, blue: 0, alpha: 1)
            break
        
    
    let initialVC = strBoard.instantiateViewController(withIdentifier: "TutorialOneVC")

    self.pageController?.setViewControllers([initialVC], direction: .forward, animated: true, completion: nil)

    self.pageController?.didMove(toParent: self)

【讨论】:

以上是关于UIPageViewController 页面控件背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

UIPageControl(页面控件)不显示在 UIPageViewController

UIPageViewController:每页更改页面指示器/页面控件的颜色

iOS UIPageViewController 页面控件不同步

UIPageViewController 页面控件太靠近 iPhone X iOS 11 上的主页栏

改变页面控件的位置

UIPageViewController