如何调整UIPageViewController中UIPageControl的位置?附代码
调整UIPageViewController中UIPageControl的位置方法
嘿,要搞定UIPageViewController里UIPageControl的位置调整,有两种比较靠谱的思路,我结合你的代码给你拆解一下:
方法一:自定义UIPageControl(推荐)
系统自带的UIPageControl是UIPageViewController的私有子视图,直接修改容易被系统内部逻辑重置位置,所以自定义一个来替代是更稳妥的方案:
步骤1:添加自定义PageControl属性
在你的PageControllerViewController类里声明一个自定义的UIPageControl:
class PageControllerViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { private var pageViewModel: PageViewModel! private let customPageControl = UIPageControl() // 新增自定义PageControl // 你的初始化方法... init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : Any]? = nil, withViewModel viewModel:PageViewModel) { super.init(transitionStyle: .scroll, navigationOrientation: navigationOrientation, options: options) self.pageViewModel = viewModel } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
步骤2:配置并添加到视图
在viewDidLoad里初始化样式,用AutoLayout固定到你想要的位置,同时隐藏系统自带的PageControl:
override func viewDidLoad() { super.viewDidLoad() dataSource = self delegate = self // 配置自定义PageControl样式 customPageControl.numberOfPages = pageViewModel.pageCount // 假设你的ViewModel提供页面总数 customPageControl.currentPage = 0 customPageControl.pageIndicatorTintColor = .lightGray customPageControl.currentPageIndicatorTintColor = .systemBlue customPageControl.translatesAutoresizingMaskIntoConstraints = false view.addSubview(customPageControl) // 用约束固定位置,比如底部安全区上方20pt,水平居中 NSLayoutConstraint.activate([ customPageControl.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20), customPageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor) ]) // 隐藏系统自带的PageControl view.subviews.forEach { subview in if let systemPageControl = subview as? UIPageControl { systemPageControl.isHidden = true } } }
步骤3:同步页码变化
实现UIPageViewController的代理方法,在页面切换完成时更新自定义PageControl的当前页码:
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { guard completed, let currentVC = pageViewController.viewControllers?.first else { return } // 假设你的ViewModel有方法根据控制器获取索引 let currentIndex = pageViewModel.indexOfViewController(currentVC) customPageControl.currentPage = currentIndex }
方法二:修改系统自带UIPageControl的位置
如果不想自定义,也可以直接找到系统的PageControl修改它的布局,但要注意系统可能在某些时机重置它的位置,所以最好在viewDidLayoutSubviews里做修改:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() view.subviews.forEach { subview in if let systemPageControl = subview as? UIPageControl { // 关闭自动布局,改用自定义约束 systemPageControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ // 比如调整到底部上方50pt的位置 systemPageControl.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -50), systemPageControl.centerXAnchor.constraint(equalTo: view.centerXAnchor) ]) } } }
这种方法的缺点是系统内部的布局更新可能会覆盖你的修改,所以更推荐第一种自定义的方案。
内容的提问来源于stack exchange,提问作者saharthana
相关产品推荐
相关产品推荐

