UIPageControl 在 iOS 14 中不可见

问题描述 投票:0回答:8

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

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

Page control is in view hierarchy yet it is not visible

ios swift xcode uikit ios14
8个回答
15
投票

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


8
投票

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

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())"
        }
    }
}

7
投票

我有同样的问题,当UIPageControl的宽度很短时,例如80pt,我在iOS 14或更高版本中设置了

pageControl.backgroundStyle = .minimal
。它对我有用。


3
投票

经过多次尝试,唯一对我有用的就是通过添加 UIPageControl 的约束来增加它的宽度。对我来说效果很好。

ios14 的 pagecontrol 中还添加了一些新功能。您可以参考此链接:https://medium.com/better-programming/take-a-look-at-ios-14s-new-uipagecontrol-3207a10212b9


0
投票

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


0
投票

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

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

0
投票

pageControl.backgroundStyle = .minimal
对我有用。


-1
投票

iOS 14 无法设置点边框,因为 UIPageControl 子视图不是页面点。 您可以更改故事板或 xib 上的点颜色,但无法更改点边框。

© www.soinside.com 2019 - 2024. All rights reserved.