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
视图没有颜色,基本上显示为黑色。将此添加到您的UIPageViewController
的viewDidLoad:
函数中以将黑色更改为红色。 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 页面控件不同步