如何让UIPageViewController的圆点页码指示器背景透明?
我之前也踩过UIPageViewController页码指示器这个坑!你说的用UIColor.clear设置背景不生效的情况太常见了——原生的UIPageControl内部有默认的背景渲染逻辑,直接设透明根本没用。给你几个亲测有效的解决方案:
方案一:iOS14+官方API(最推荐)
从iOS14开始,苹果给UIPageControl加了专门的backgroundStyle属性,设置成.minimal就能直接让背景透明,完全不需要hack:
// 先拿到你的UIPageControl实例 if let pageControl = self.pageViewController?.view.subviews.first(where: { $0 is UIPageControl }) as? UIPageControl { if #available(iOS 14.0, *) { pageControl.backgroundStyle = .minimal } }
这个是官方支持的方法,没有任何审核风险,优先用这个!
方案二:KVC修改内部背景视图(适配iOS14以下)
如果需要兼容iOS14之前的版本,可以通过KVC访问UIPageControl内部的私有背景视图,直接隐藏或者设透明:
if let pageControl = self.pageViewController?.view.subviews.first(where: { $0 is UIPageControl }) as? UIPageControl { // 拿到内部的_backgroundView if let backgroundView = pageControl.value(forKey: "_backgroundView") as? UIView { backgroundView.isHidden = true // 或者直接设透明:backgroundView.backgroundColor = .clear } }
⚠️ 注意:虽然这个方法在大部分场景下能通过App Store审核,但毕竟是访问私有API,苹果可能在后续系统版本中修改这个key,建议同时做版本判断和备选方案。
方案三:完全自定义UIPageControl(最稳妥)
如果不想碰私有API,也可以直接隐藏原生的指示器,自己实现一个完全可控的页码控件:
- 先关闭原生指示器:
// 在初始化UIPageViewController时或者viewDidLoad中设置 self.pageViewController?.showsPageIndicator = false
- 创建自定义的UIPageControl并添加到视图:
// 自定义页码控件 let customPageControl = UIPageControl() customPageControl.numberOfPages = 3 // 替换成你的页面总数 customPageControl.currentPageIndicatorTintColor = .systemBlue // 当前页圆点颜色 customPageControl.pageIndicatorTintColor = .systemGray2 // 其他页圆点颜色 customPageControl.backgroundColor = .clear // 这里设透明完全生效 // 设置布局,比如底部居中 customPageControl.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(customPageControl) NSLayoutConstraint.activate([ customPageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), customPageControl.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20) ])
- 在页面切换时更新当前页码:
// 实现UIPageViewController的代理方法 func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { guard completed, let currentVC = pageViewController.viewControllers?.first, let pageIndex = yourPageDataSourceArray.firstIndex(of: currentVC) else { return } customPageControl.currentPage = pageIndex }
把yourPageDataSourceArray替换成你存放页面控制器的数组就行,这个方案完全自定义,样式想怎么改都行。
你可以根据自己的项目iOS版本要求选择合适的方案,亲测都能解决背景不透明的问题~
内容的提问来源于stack exchange,提问作者nemocode
相关产品推荐
相关产品推荐

