【问题标题】:UIPageControl not visible in iOS 14UIPageControl 在 iOS 14 中不可见
【发布时间】:2021-01-09 01:00:30
【问题描述】:
我有一个 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
【解决方案1】:
如果 UIPageControl 在 iOS 14 中不可见,则只需添加宽度约束并分配关系“大于或等于”或增加 UIPageControl 的宽度。
【解决方案2】:
我有同样的问题,当 UIPageControl 的宽度很短时,比如 80pt,我在 iOS 14 或更高版本中设置了pageControl.backgroundStyle = .minimal。它对我有用。
【解决方案3】:
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())"
}
}
}
【解决方案5】:
我自己最近也被这个问题困扰,在花了很多时间尝试不同的方法之后,我可以通过简单地将 Storyboard 中的当前 UIPageController 替换为新的 UIPageController 来使其工作。
【解决方案6】:
试试下面的一件事来解决:
- 将宽度和高度增加两倍或三倍。
- 向页面视图控制器添加约束。
- 在 Storyboard 或 XIB 中添加页面控件。比上面的 2 点要容易得多。
【解决方案7】:
iOS 14 无法设置点边框,因为 UIPageControl 子视图不是页面点。
您可以更改情节提要或 xib 上的点颜色,但不能更改点边框。