2020. Свифт обновлен.
2017 ответ...
В настоящее время это очень легко сделать, просто используя раскадровку.
Такого рода полноэкранные обучающие программы какое-то время были популярны в качестве заставок к приложениям, поэтому я назвал класс ниже IntroPages
.
Шаг 1. Создайте контейнерное представление, которое является UIPageViewController.
Если вы новичок в iOS, вот руководство по представлению контейнера.
(Примечание: если вы не знаете, как изменить представление контейнера на UIPageViewController, прокрутите вниз до раздела Как изменить... в этом руководстве!
)
Вы можете придать контейнеру любую форму. Как и любое представление контейнера, оно может быть полноэкранным или небольшой частью экрана — как вам угодно.
Шаг 2,
Создайте четыре простых, обычных контроллера представления, которые могут быть чем угодно — изображениями, текстом, таблицами, чем угодно. (Фиолетовый в примере.)
![четыре контроллера](https://i.stack.imgur.com/T3aZC.png)
Обратите внимание, что они просто находятся на вашей раскадровке, не связывая их ни с чем.
Шаг 3: вы должны установить идентификаторы этих четырех страниц. id1, id2, id3, id4 в порядке.
![установить идентификаторы](https://i.stack.imgur.com/k5TnW.png)
Шаг 4, скопируйте и вставьте! Вот класс IntroPages,
class IntroPages: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var pages = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
self.dataSource = self
let p1: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id1")
let p2: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id2")
let p3: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id3")
// etc ...
pages.append(p1)
pages.append(p2)
pages.append(p3)
// etc ...
setViewControllers([p1], direction: UIPageViewController.NavigationDirection.forward, animated: false, completion: nil)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController)-> UIViewController? {
let cur = pages.firstIndex(of: viewController)!
// if you prefer to NOT scroll circularly, simply add here:
// if cur == 0 { return nil }
var prev = (cur - 1) % pages.count
if prev < 0 {
prev = pages.count - 1
}
return pages[prev]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController)-> UIViewController? {
let cur = pages.firstIndex(of: viewController)!
// if you prefer to NOT scroll circularly, simply add here:
// if cur == (pages.count - 1) { return nil }
let nxt = abs((cur + 1) % pages.count)
return pages[nxt]
}
func presentationIndex(for pageViewController: UIPageViewController)-> Int {
return pages.count
}
}
(Посмотрите на комментарии — там есть код для зацикливания или линейного пейджинга по вашему выбору.)
В раскадровке посмотрите на UIPageViewController. Установите класс IntroPages
.
Вот и все — готово.
Вы просто устанавливаете стиль перехода на раскадровке,
![введите здесь описание изображения](https://i.stack.imgur.com/dLzwb.png)
очень вероятно, что вам нужен Scroll, а не другой.
Готово! И сейчас ...
Введение в добавление UIPageControl...
Вы добавляете UIPageControl
в класс-оболочку самого высокого уровня, Intro в приведенном выше примере изображения.
(Так что, как ни странно, нет в контроллере просмотра страницы, не в IntroPages.)
Таким образом, на раскадровке очень просто перетащите UIPageControl
на Intro.
Примечание! Как ни странно, в раскадровках вы не можете перемещать UIPageControl.
Когда вы перетаскиваете элемент управления страницы на контроллер представления, он просто находится в фиксированном месте. Это совершенно странно, но это так. Не тратьте время на то, чтобы переместить его :)
Из Intro вам нужно будет получить доступ к контроллеру просмотра страниц (IntroPages) обычным способом:
class Intro: UIViewController {
@IBOutlet var pageControl: UIPageControl!
var pageViewController: IntroPages!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueIntroPages" {
// if new to container views, identifier explained here:
// https://stackoverflow.com/a/23403979/294884
pageViewController = (segue.destination as! IntroPages)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.bringSubviewToFront(pageControl)
pageControl.currentPage = 0
}
Обратите внимание на эту ключевую строку:
view.bringSubviewToFront(pageControl)
Добавьте эту функцию
@IBAction func userDidChangePageControl(_ sender: UIPageControl) {}
а затем в раскадровке щелкните элемент управления страницей и перетащите valueChanged в эту функцию.
Самая простая версия функции:
@IBAction func userDidChangePageControl(_ sender: UIPageControl) {
pageViewController.setViewControllers(
[pageViewController.pages[newIndex]],
direction: (pageViewController.currentIndex < newIndex)
? .forward : .reverse,
animated: true, completion: nil)
}
Однако см. этот контроль качества Правильно решите новый режим анимации быстрого щелчка/избегайте половины страницы ошибка для нового UIPageControl согласно Apple для более полного исследования этого.
в IntroPages добавить свойство...
var currentIndex: Int {
if let visibleViewController = viewControllers?.first,
let ci = pages.firstIndex(of: visibleViewController) {
return ci
}
else {
return 0
}
}
в IntroPages также добавьте следующее, чтобы, когда пользователь проводит пальцем по экрану, UIPageControl знал, что делать:
func pageViewController(_ pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
(parent as? Intro)?.pageControl.currentPage = currentIndex
}
в IntroPages также добавьте следующее из-за ошибки / необычного поведения Apple:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let subViews = view.subviews
var scrollView: UIScrollView? = nil
var pageControl: UIPageControl? = nil
// maintain this code order...
for view in subViews {
if view.isKind(of: UIScrollView.self) {
scrollView = view as? UIScrollView
}
else if view.isKind(of: UIPageControl.self) {
pageControl = view as? UIPageControl
}
}
// maintain this code order...
if (scrollView != nil && pageControl != nil) {
scrollView?.frame = view.bounds
if let pageControl = pageControl {
view.bringSubviewToFront(pageControl) }
}
}
Вы в пути.
person
Fattie
schedule
24.09.2014