Как реализовать UIPageControl в Swift

Хорошо, поэтому я боюсь здесь и не нашел рабочего решения. Я сам изучал Swift без опыта Objective C (знаю, я знаю).

В моем приложении у меня есть мой основной UIViewController, subview, прозрачный, но слайды снизу экрана, а затем 4 подпункта раздвижного подсмотра, которые являются всеми работающими UIScrollViews. У меня включен пейджинг, и он отлично работает, но я хотел бы добавить UIPageControl для каждого из них. Я серьезно не могу понять делегатов и как реализовать быстрое использование. Любая помощь приветствуется!

Кроме того, я делаю это все программно, поэтому ни один IB, пожалуйста. Счастливый предоставить код, если это поможет. Благодаря

Ответы

Ответ 1

Я думаю, что вы и/или кто-то другой, кто ищет, как это сделать, найдут этот ответ полезным. Пример кода позволил мне создать индикатор управления страницей на моем scrollview, и это был первый раз, когда мы пытались это сделать. Мне было очень ясно.

Строки, которые вы, вероятно, должны добавить в свой проект:

1: добавьте UIScrollViewDelegate в качестве протокола, когда вы сначала называете класс контроллера вида.

2: в объявлении класса создайте переменную pageControl. Вам нужно будет играть с номерами кадров, чтобы они отображались там, где вы хотите. текущие номера сделали меня посередине окна для меня. Для справки цифры означают (положение x для верхнего левого угла индикатора, координата y для верхнего левого угла, ширина индикатора страницы, высота индикатора страницы)

var pageControl : UIPageControl = UIPageControl(frame: CGRectMake(50, 300, 200, 20))

  1. in viewDidLoad добавьте следующие строки:

    configurePageControl()

    scrollView.delegate = self

  2. вам нужно добавить два метода после viewDidLoad. один вызывается в viewDidLoad

    func configurePageControl() {
         self.pageControl.numberOfPages = <some reference to the number of pages>
         self.pageControl.currentPage = 0
         self.pageControl.tintColor = UIColor.redColor()
         self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
         self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()     
         self.view.addSubview(pageControl)
     }
    

    и

     func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        pageControl.currentPage = Int(pageNumber)
    }
    

Делегат scrollView на самом деле очень прост в настройке. Добавьте UIScollViewDelegate в качестве протокола, который будет реализован вашим классом ViewController, добавив его после объявления класса: class YourClassName: UIScrollViewDelegate. А затем в viewDidLoad() вы завершите настройку делегата, присвоив свойство делегата прокрутки классу с помощью строки scrollView.delegate = self. (снова см. пример, на который я связан, если вам нужно уточнить, куда идут эти команды)

Ответ 2

Просто установите его в коде следующим образом:

private var pageControl = UIPageControl(frame: .zero)

private func setupPageControl() {

    pageControl.numberOfPages = controllers.count
    pageControl.translatesAutoresizingMaskIntoConstraints = false
    pageControl.currentPageIndicatorTintColor = UIColor.orange
    pageControl.pageIndicatorTintColor = UIColor.lightGray.withAlphaComponent(0.8)

    let leading = NSLayoutConstraint(item: pageControl, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0)
    let trailing = NSLayoutConstraint(item: pageControl, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0)
    let bottom = NSLayoutConstraint(item: pageControl, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)

    view.insertSubview(pageControl, at: 0)
    view.bringSubview(toFront: pageControl)
    view.addConstraints([leading, trailing, bottom])
}

Ответ 3

Делегаты - это просто методы класса, которые можно отнести к другому классу. Эти методы обычно являются обратными вызовами.

например. Обратный вызов для TextField, когда пользователь обращается к возврату, может быть реализован в делегате. Делегат может быть реализован в классе ViewController.

Теперь, когда пользователь обращается, объект TextField вызовет метод делегата в объекте ViewController. Самое замечательное в этом: вы можете получить доступ ко всем переменным и методам объекта ViewController из делегированного метода. В противном случае вам понадобится дескриптор объекта ViewController внутри самого объекта TextField.

Делегаты реализуются как протоколы, которые являются просто интерфейсами. Поэтому, если ViewController реализует протокол TextFieldDelegate, все ваши обратные вызовы текстового поля могут быть вызваны из объекта ViewController.

Надеюсь, это поможет.