UIPageControl не отображается в iOS 14

#ios #swift #xcode #uikit #ios14

#iOS #swift #xcode #uikit #ios14

Вопрос:

У меня есть UIPageControl, который отлично работал в моем производственном приложении в течение последних 6 месяцев. Однако после обновления всех моих тестовых устройств до iOS 14 и обновления Xcode до версии 12 мой UIPageControl, который у меня есть в ячейке TableView, больше не отображается.

Я ничего не изменил в своем коде, это произошло спонтанно из-за обновления программного обеспечения. Я понимаю, что Apple изменила иерархию представлений UITableView, а также изменила элементы управления страницами. У кого-нибудь есть идеи, почему этот элемент управления страницей расположен правильно, но остается невидимым?

Управление страницей находится в иерархии представлений, но оно не отображается

Ответ №1:

если UIPageControl не отображается в iOS 14, просто добавьте ограничение ширины и назначьте отношение «больше или равно» или увеличьте ширину UIPageControl.

Ответ №2:

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

Ответ №3:

У меня такая же проблема, когда ширина UIPageControl невелика, например, 80pt, которую я устанавливаю pageControl.backgroundStyle = .minimal в iOS 14 или более поздней версии. Это работает для меня.

Ответ №4:

После долгих попыток единственное, что мне подходит, — это просто увеличить ширину UIPageControl, добавив в него ограничения. Для меня это работает нормально.

Также в pagecontrol для ios14 добавлены некоторые новые функции. Вы можете перейти по этой ссылке: https://medium.com/better-programming/take-a-look-at-ios-14s-new-uipagecontrol-3207a10212b9

Ответ №5:

Недавно меня самого беспокоила эта проблема, и, потратив много часов и попробовав разные методы, я смог заставить ее работать, просто заменив текущий UIPageController в раскадровке на новый UIPageController.

Ответ №6:

Попробуйте ниже разобраться с одной из вещей :

  1. Увеличьте ширину и высоту в два или три раза.
  2. Добавьте ограничение к контроллеру просмотра страницы.
  3. Добавьте элемент управления страницей в раскадровку или XIB. Это будет очень просто, чем выше 2 баллов.

Ответ №7:

iOS 14 не может установить границу точки, поскольку вложенный просмотр UIPageControl не является точкой страницы. Вы можете изменить цвет точки на раскадровке или xib, но вы не можете изменить границу точки.