You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:19:46