おーしまブログ

プログラミングやってます

【swift5】ViewPager-Swift使ってみた

こんにちは、おーしまです。

今回は、androidのViewPager的なものを使いたかったので、その時に「ViewPager-Swift」と言うライブラリを発見したのでそれを使ってみました。
結構、androidと似た形になったと思います。

「ViewPager-Swift」のGitHub
GitHub - nrlnishan/ViewPager-Swift: Simple View Pager library for swift using UIPageViewController and Scroll View


使う際は、

pod "ViewPager-Swift"

でライブラリをインストールしましょう。

完成形
f:id:tomo_bb_aki0118115:20210619165245p:plain:w300:h600 f:id:tomo_bb_aki0118115:20210619165325p:plain:w300:h600


画面上部のタブをタップ、もしくは画面を横へスワイプすることで画面が切り替わります。

今回は、ユーザーの数だけタブを作り、タブの切り替えで同じ画面のデータだけ入れ替えています。
タブごとに全く別のレイアウトの画面を表示させることもできるようです。



コードです。

Main.storyboard
f:id:tomo_bb_aki0118115:20210619170246p:plain

ViewPagerを使うViewControllerと、画面を切り替える際に使うListTableViewControllerの2種類用意します。
タブで切り替える画面によって、レイアウトが違う場合は、その数だけのViewControllerが必要です。



ViewController.swift

import UIKit
import ViewPager_Swift

class ViewController: UIViewController {
    
    //表示するデータ
    var userData: [User]?
    
    //ViewPagerで表示させるViewController
    var viewPagerViewController: [ListTableViewController] = []
    
    
    //ViewPagerで表示させるタブの配列
    var viewPagerTabs: [ViewPagerTab] = []
    
    //ViewPager
    var viewPager: ViewPager?
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //表示するデータの作成
        let cars1 = [Car(carName: "Impreza", carMaker: "SUBARU"), Car(carName: "A4", carMaker: "Audi")]
        let cars2 = [Car(carName: "RAV4", carMaker: "TOYOTA")]
        let cars3 = [Car(carName: "mazda3", carMaker: "MAZDA"), Car(carName: "model3", carMaker: "Tesla"), Car(carName: "GTR", carMaker: "Nissan")]
        
        let user1 = User(userName: "けんた", userCars: cars1)
        let user2 = User(userName: "あかね", userCars: cars2)
        let user3 = User(userName: "ともき", userCars: cars3)
        
        self.userData = [user1, user2, user3]
        
        
        //初期化
        self.viewPagerTabs = []
        self.viewPagerViewController = []
        //userDataの数だけ繰り返す
        self.userData?.forEach({ user in
            //ViewPagerで表示させるViewControllerの作成
            self.viewPagerViewController.append(storyboard?.instantiateViewController(identifier: "ListTableViewController") as! ListTableViewController)
            
            //ViewPagerで表示させるタブの配列の作成
            guard let userName = user.name else { return }
            let tab = ViewPagerTab(title: userName, image: nil)
            self.viewPagerTabs.append(tab)
        })
        
        //ViewPager作成
        //オプション生成
        let myOptions = ViewPagerOptions()
        //オプションをつける
        myOptions.distribution = .segmented
        myOptions.tabViewBackgroundDefaultColor = UIColor.systemTeal
        myOptions.tabViewTextDefaultColor = UIColor.darkGray
        myOptions.isTabBarShadowAvailable = false
        myOptions.tabIndicatorViewBackgroundColor = UIColor.blue
        //ViewPager作成
        self.viewPager = ViewPager(viewController: self)
        self.viewPager?.setOptions(options: myOptions)
        self.viewPager?.setDataSource(dataSource: self)
        self.viewPager?.build()
        
    }


}

extension ViewController: ViewPagerDataSource{
    
    //ページ数を返す
    func numberOfPages() -> Int {
        return self.userData?.count ?? 0
    }
    
    //positionごとのViewControllerを返す
    func viewControllerAtPosition(position: Int) -> UIViewController {
        
        if let cars = self.userData?[position].cars {
            self.viewPagerViewController[position].cars = cars
        }
        return self.viewPagerViewController[position]
    }
    
    
    //タブの内容を返す
    func tabsForPages() -> [ViewPagerTab] {
        return self.viewPagerTabs
    }
    
    
    //最初に表示するページを返す(一番左から0)
    func startViewPagerAtIndex() -> Int {
        return 0
    }
    
    
}

表示したいデータ(今回で言うと、userData)の数だけ、VIewControllerとPagerViewTabを生成し、配列で用意しておきます。

ViewPagerのデザインなどのオプションはGitHubを見てください。


ListTableViewController.swift

import Foundation
import UIKit

class ListTableViewController: UIViewController {
    
    
    var cars: [Car]?

    
    @IBOutlet weak var listTableView: UITableView!
    {
        didSet{
            self.listTableView.dataSource = self
            self.listTableView.delegate = self
            
            listTableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "cell")
            
        }
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
    }
    
}

extension ListTableViewController: UITableViewDelegate, UITableViewDataSource {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.cars?.count ?? 0
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        cell.car = self.cars?[indexPath.row]
        return cell
    }
    
    
    
    
}


TableViewCell.swift

import Foundation
import UIKit

class TableViewCell: UITableViewCell{
    
    var car: Car?
    {
        didSet{
            
            if let car = self.car {
                
                self.carName.text = car.name
                self.carMaker.text = car.maker
            }
        }
    }
    
    
    @IBOutlet weak var carName: UILabel!
    @IBOutlet weak var carMaker: UILabel!
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        
        
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        
        
        
    }
}


TableViewCell.xib
f:id:tomo_bb_aki0118115:20210619172516p:plain


User.swift

import Foundation

class User {
    
    var name: String?
    var cars: [Car]?
    
    init(userName: String, userCars: [Car]){
        
        self.name = userName
        self.cars = userCars
    }
}


Car.swift

import Foundation

class Car {
    
    var name: String?
    var maker: String?
    
    init(carName: String, carMaker: String){
        
        self.name = carName
        self.maker = carMaker
    }
}

今回はここまでです。

実は3ヶ月ぶりくらいの投稿でした。
仕事でandroid studioxcodeの両方を触るようになったので、ご満悦です。

それでは、また

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}