UIPageControl 在 iOS 14 中不可见

Rag*_*age 11 xcode uikit ios swift ios14

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

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

页面控件在视图层次结构中但不可见

小智 12

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


Leo*_*o.J 7

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


Dav*_*rve 5

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

iOS 13 UIPageControl iOS 14 UIPageControl

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())"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)