UIPageControl 在 iOS 14 中不可见

UIPageControl not visible in iOS 14

我有一个 UIPageControl 在过去 6 个月内在我的生产应用程序中运行良好。但是,在将我所有的测试设备更新为 iOS 14 并将 Xcode 更新为 v12 之后,我在 tableView 单元格中的 UIPageControl 不再可见。

我的代码没有任何更改,这只是由于软件更新而自发发生的。我知道 Apple 已经更改了 UITableView 的视图层次结构,还修改了页面控件。有谁知道为什么这个页面控件定位正确但仍然不可见?

Page control is in view hierarchy yet it is not visible

我自己最近也被这个问题困扰了,在花了很多时间并尝试了不同的方法之后,我可以通过简单地用新的 UIPageController 替换 Storyboard 中的当前 UIPageController 来使其工作。

在尝试了很多之后,唯一对我有用的就是通过添加约束来增加 UIPageControl 的宽度。它对我来说很好用。

ios14 的页面控件中还添加了一些新功能。你可以参考这个link:https://medium.com/better-programming/take-a-look-at-ios-14s-new-uipagecontrol-3207a10212b9

iOS14 不能设置点边框,因为UIPageControl子视图不是页面点。 您可以在 Storyboard 或 xib 上更改点颜色,但不能更改点边框。

如果 UIPageControl 在 iOS14 中不可见,则只需添加宽度约束并指定关系“大于或等于”或增加 UIPageControl 的宽度。

尝试以下其中一项来解决问题:

  1. 将宽度和高度增加一倍或三倍。
  2. 向页面视图控制器添加约束。
  3. 在 Storyboard 或 XIB 中添加页面控件。会比上面2点容易很多。

我有同样的问题,当UIPageControl的宽度很短时,比如80pt,我在iOS 14或更高版本中设置了pageControl.backgroundStyle = .minimal。对我有用。

UIPageControl 在 iOS14 中的工作方式略有不同。如果宽度太小,它不显示任何内容可能会令人惊讶。

import UIKit

class ViewController: UIViewController {
    
    lazy var label: UILabel = UILabel()
    var widthConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        let pageControl = UIPageControl()
        pageControl.numberOfPages = 10
        pageControl.currentPage = 3
        pageControl.pageIndicatorTintColor = .red
        pageControl.currentPageIndicatorTintColor = .green
        pageControl.layer.borderWidth = 1
        pageControl.layer.borderColor = UIColor.purple.cgColor
        widthConstraint = pageControl.widthAnchor.constraint(equalToConstant: 100)
        widthConstraint.isActive = true
        
        let slider = UISlider()
        slider.minimumValue = 0
        slider.maximumValue = 300
        slider.value = 100
        slider.widthAnchor.constraint(equalToConstant: 200).isActive = true
        slider.addTarget(self, action: #selector(sliderValueDidChange(_:)), for: .valueChanged)
        
        let stackView = UIStackView(arrangedSubviews: [label, pageControl, slider])
        stackView.axis = .vertical
        stackView.alignment = .center
        stackView.spacing = 40
        
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stackView.widthAnchor.constraint(equalTo: view.widthAnchor)
        ])
        
        updateLabel()
    }


    @objc
    func sliderValueDidChange(_ sender: Any?) {
        guard let slider = sender as? UISlider else { return }
        widthConstraint.constant = CGFloat(slider.value)
        updateLabel()
    }
    
    func updateLabel() {
        if #available(iOS 14.0, *) {
            label.text = "iOS 14 PageControl width: \(widthConstraint.constant.rounded())"
        } else {
            label.text = "iOS 13 PageControl width: \(widthConstraint.constant.rounded())"
        }
    }
}