使用UIPageViewController創(chuàng)建首次進(jìn)入應(yīng)用的歡迎走馬燈頁

UIPageViewControlle

主視圖

  • 主視圖是指應(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 controller

      • pageViewController(_: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘姜,一起剝皮案震驚了整個濱河市鬓照,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孤紧,老刑警劉巖豺裆,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異号显,居然都是意外死亡臭猜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門押蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑歌,“玉大人,你說我怎么就攤上這事活喊∝はィ” “怎么了量愧?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵钾菊,是天一觀的道長。 經(jīng)常有香客問我偎肃,道長煞烫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任累颂,我火速辦了婚禮滞详,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘紊馏。我一直安慰自己料饥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布朱监。 她就那樣靜靜地躺著岸啡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赫编。 梳的紋絲不亂的頭發(fā)上巡蘸,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音擂送,去河邊找鬼悦荒。 笑死,一個胖子當(dāng)著我的面吹牛嘹吨,可吹牛的內(nèi)容都是我干的搬味。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碰纬!你這毒婦竟也來了产还?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘀趟,失蹤者是張志新(化名)和其女友劉穎脐区,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體她按,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡牛隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酌泰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒佣。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陵刹,靈堂內(nèi)的尸體忽然破棺而出默伍,到底是詐尸還是另有隱情,我是刑警寧澤衰琐,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布也糊,位于F島的核電站,受9級特大地震影響羡宙,放射性物質(zhì)發(fā)生泄漏狸剃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一狗热、第九天 我趴在偏房一處隱蔽的房頂上張望钞馁。 院中可真熱鬧,春花似錦匿刮、人聲如沸僧凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训措。三九已至,卻和暖如春虑啤,著一層夾襖步出監(jiān)牢的瞬間隙弛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工狞山, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留全闷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓萍启,卻偏偏與公主長得像总珠,于是被迫代替她去往敵國和親屏鳍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容