主視圖
主視圖是指應(yīng)用的內(nèi)容主界面
添加viewDidAppear(_:animated)中通過withIdentifier實例化視圖容器
通過present(UIViewController:animated:completion)顯示視圖
import UIKit
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if UserDefaults.standard.bool(forKey: "hasViewedWalkthrough") {
return
}
if let pageViewController = storyboard?.instantiateViewController(withIdentifier: "WalkthroughController") as? WalkthroughPageViewController {
present(pageViewController, animated: true, completion: nil)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
滑動視圖
容器視圖
-
創(chuàng)建自定義的類繼承UIPageViewController并,實現(xiàn)UIPageViewControllerDataSource協(xié)議
定義每個視圖顯示的內(nèi)容數(shù)組
-
實現(xiàn)UIPageViewControllerDataSource協(xié)議的兩個方法當(dāng)用戶導(dǎo)航切換頁面是都會被調(diào)用
指定和返回一個顯示上一個或是下一個指定的content view controllerpageViewController(_:viewControllerBefore:)
pageViewController(_:viewControllerAfter:)
在viewDidLoad中將dataSource設(shè)置為self
在view中調(diào)用setViewControllers方法,在參數(shù)中設(shè)置要顯示的內(nèi)容視圖
-
定義一個輔助方法用于返回內(nèi)容視圖
避免數(shù)組索引越界
通過storyboard?.instantiateViewController(withIdentifier:)實例化一個視圖淮捆,并設(shè)置相關(guān)的視圖內(nèi)容读第,如UILabel等。
返回內(nèi)容視圖
-
創(chuàng)建Page的指示器的兩種方式
-
默認(rèn)的指示器
-
需要實現(xiàn)UIPageViewControllerDataSource協(xié)議的兩個可選方法
presentationCount(for:)返回頁面總數(shù)
presentationIndex(for:)返回當(dāng)前選中的頁面指示器索引
-
-
自定義的指示器
從組件庫中拖拽出一個 Page controller組件到視圖,并放到合適的位置添加好約束
在內(nèi)容視圖類定義一個@IBOutlet var pagecontrol連接到視圖中的Page Control組件,并設(shè)置總數(shù)和當(dāng)前所在的索引
在viewDidLoad中賦值 pageControl.currentPage = index
-
import UIKit
class WalkthroughPageViewController: UIPageViewController, UIPageViewControllerDataSource {
var pageHeadings = ["Personalize", "Locate", "Discover"]
var pageImages = ["foodpin-intro-1", "foodpin-intro-2", "foodpin-intro-3"]
var pageContent = ["Pin your favorite restaurants and create your own food guide", "Search and locate your favourite restaurant on Maps", "Find restaurants pinned by your friends and other foodies around the world"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
if let startingViewController = contentViewController(at: 0) {
setViewControllers([startingViewController], direction: .forward, animated: true, completion: nil)
} else {
print("nil")
}
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = (viewController as! WalkthroughContentViewController).index
index -= 1
return contentViewController(at: index)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
var index = (viewController as! WalkthroughContentViewController).index
index += 1
return contentViewController(at: index)
}
func contentViewController(at index: Int) -> WalkthroughContentViewController? {
if index < 0 || index >= pageHeadings.count {
return nil
}
if let pageContentViewController = storyboard?.instantiateViewController(withIdentifier: "WalkthroughContentViewController") as? WalkthroughContentViewController {
pageContentViewController.heading = pageHeadings[index]
pageContentViewController.content = pageContent[index]
pageContentViewController.imageFile = pageImages[index]
pageContentViewController.index = index
return pageContentViewController
}
return nil
}
func forward(index: Int) {
if let nextViewController = contentViewController(at: index + 1) {
setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)
}
}
}
內(nèi)容視圖
是一個可重用的視圖,繼承正常的UIViewController
在這里定義視圖上的內(nèi)容魂务,如UILabel、UIImageView、或其它視圖組件
也可以定義一些對視圖的操作方法
import UIKit
class WalkthroughPageViewController: UIPageViewController, UIPageViewControllerDataSource {
var pageHeadings = ["Personalize", "Locate", "Discover"]
var pageImages = ["foodpin-intro-1", "foodpin-intro-2", "foodpin-intro-3"]
var pageContent = ["Pin your favorite restaurants and create your own food guide", "Search and locate your favourite restaurant on Maps", "Find restaurants pinned by your friends and other foodies around the world"]
override func viewDidLoad() {
super.viewDidLoad()
dataSource = self
if let startingViewController = contentViewController(at: 0) {
setViewControllers([startingViewController], direction: .forward, animated: true, completion: nil)
} else {
print("nil")
}
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = (viewController as! WalkthroughContentViewController).index
index -= 1
return contentViewController(at: index)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
var index = (viewController as! WalkthroughContentViewController).index
index += 1
return contentViewController(at: index)
}
func contentViewController(at index: Int) -> WalkthroughContentViewController? {
if index < 0 || index >= pageHeadings.count {
return nil
}
if let pageContentViewController = storyboard?.instantiateViewController(withIdentifier: "WalkthroughContentViewController") as? WalkthroughContentViewController {
pageContentViewController.heading = pageHeadings[index]
pageContentViewController.content = pageContent[index]
pageContentViewController.imageFile = pageImages[index]
pageContentViewController.index = index
return pageContentViewController
}
return nil
}
func forward(index: Int) {
if let nextViewController = contentViewController(at: index + 1) {
setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)
}
}
}
頁面只在應(yīng)用最初進(jìn)入的時候顯示一次的功能
使用UserDefaults類來存儲是否顯示過的狀態(tài)
在最后一個內(nèi)容界面按下“進(jìn)入界面”后的位置使用UserDefaults.standard.set(Bool:key:)方法設(shè)置保存狀態(tài)
在主頁面的viewDidAppear(animated:)中檢測狀態(tài)
這里放出代碼地址: https://github.com/dengxife/SwiftTips