![見出し画像](https://assets.st-note.com/production/uploads/images/102135171/rectangle_large_type_2_84478f29d3c80dcfc2aa5a3b916213da.png?width=1200)
【徒然iOS】気ままにUIKit103〜画面遷移のアニメーション〜
概要
このマガジンは四十を過ぎたおっさんが、
を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。
今回
をハイ、レッツゴ🕺
今回は設定項目みたいなんで、一覧を絡めながら〜〜〜
前準備
念の為、
バックアップ
前回やったビューとクラスの同じモノを新規で追加
をやってから本題へ💃
![](https://assets.st-note.com/img/1680661084997-9kMiZjQAhg.png?width=1200)
今回は、枕草子にしてみた🕺
![](https://assets.st-note.com/img/1680661216517-11R9b341Pc.png?width=1200)
一応、用意したコード
class PageViewAnimationController: UIPageViewController,UIPageViewControllerDataSource {
func newVC(viewControllerID: String) -> UIViewController {
return storyboard!.instantiateViewController(withIdentifier: viewControllerID)
}
lazy var idList:[UIViewController] = {
return [
self.newVC(viewControllerID: "第1段"),
self.newVC(viewControllerID: "第22段"),
self.newVC(viewControllerID: "第26段")
]
}()
var showingIndex = 0
//最初からあるメソッド
override func viewDidLoad() {
//最初のビューコントローラーを取得する。
let controller: [UIViewController] = [idList.first!]
//ビューコントローラーを表示する。
self.setViewControllers(controller, direction: .forward, animated: false, completion: nil)
//データ提供元に自分を設定する。
self.dataSource = self
}
//右ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = idList.firstIndex(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return nil
}
guard idList.count > previousIndex else {
return nil
}
showingIndex -= 1
return idList[previousIndex]
}
//左ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = idList.firstIndex(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
let controllersCount = idList.count
guard controllersCount != nextIndex else {
return nil
}
guard controllersCount > nextIndex else {
return nil
}
showingIndex += 1
return idList[nextIndex]
}
func viewController(at index: Int) -> UIViewController {
return idList[index]
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
return showingIndex
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return idList.count
}
@IBAction func webButton(_ sender: Any) {
let url = URL(string: pageViewAnimationController)
let safariView = SFSafariViewController(url: url!)
present(safariView, animated: true)
}
}
本題
![](https://assets.st-note.com/img/1680661465409-AXGuTcWVlv.png)
まずは、恒例の一覧表で〜〜〜
一覧表
![](https://assets.st-note.com/img/1680661730225-BbGasMRsu0.png?width=1200)
今回は、ちょっと項目も少ないので〜〜〜
ゆっくり動かしながらやってみよう🕺
Navigation
![](https://assets.st-note.com/img/1680661830303-Q7XFb83nrx.png?width=1200)
![](https://assets.st-note.com/img/1680662503174-urG0DT43Ay.png?width=1200)
ページコントローラの表示が消えてるから、個人的には使えないなあ🤔
Transition Style
![](https://assets.st-note.com/img/1680661933762-GlwbvFj6KS.png?width=1200)
![](https://assets.st-note.com/img/1680662230516-4Y6Q8z4qUj.png?width=1200)
Page Spacing
![](https://assets.st-note.com/img/1680662050544-8NdeoggS5u.png?width=1200)
戻して〜〜
160にしてみた
![](https://assets.st-note.com/img/1680662130987-vnrFuY2vCW.png?width=1200)
逆に違和感しかないわ〜〜〜
Spine Location
![](https://assets.st-note.com/img/1680663077822-K6z6EqKp4F.png?width=1200)
![](https://assets.st-note.com/img/1680663128314-vwTsPbQqj9.png?width=1200)
Mid」に設定したときは、Double Sidedにチェックを入れてページを両面にする必要がある。そうしなければ以下のエラーが発生する。
てことなんで〜〜〜
![](https://assets.st-note.com/img/1680663266971-j62nrirZiQ.png?width=1200)
自動的にDoubleSidedにチェックが入った〜〜〜
//
// TestPageViewController.swift
//
import UIKit
class TestPageViewController: UIPageViewController,UIPageViewControllerDataSource {
let idList = ["Sea", "Morning", "Evening", "Night"]
//最初からあるメソッド
override func viewDidLoad() {
//1ページ目のビューコントローラーを取得する。
let controller = storyboard!.instantiateViewControllerWithIdentifier(idList[0])
//【変更箇所】2ページ目のビューコントローラーを取得する。
let controller2 = storyboard!.instantiateViewControllerWithIdentifier(idList[1])
//【変更箇所】ビューコントローラーを表示する。
self.setViewControllers([controller, controller2], direction: .Forward, animated: true, completion:nil)
//データ提供元に自分を設定する。
self.dataSource = self
}
//右ドラッグ時の呼び出しメソッド
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
let index = idList.indexOf(viewController.restorationIdentifier!)!
if (index > 0) {
//前ページのビューコントローラーを返す。
return storyboard!.instantiateViewControllerWithIdentifier(idList[index-1])
}
return nil
}
//左ドラッグ時の呼び出しメソッド
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
let index = idList.indexOf(viewController.restorationIdentifier!)!
if (index < idList.count-1) {
//次ページのビューコントローラーを返す。
return storyboard!.instantiateViewControllerWithIdentifier(idList[index+1])
}
return nil
}
//全ページ数を返すメソッド
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return idList.count
}
//初期表示のページのインデックス番号
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
}
と、奇数しか頁がないので〜〜〜一個、ビューを増やして〜〜〜
![](https://assets.st-note.com/img/1680664797152-nHQst1sE3x.png?width=1200)
でコードをはめ込んで直してみると、
![](https://assets.st-note.com/img/1680665371235-fSJU1vyWCA.png?width=1200)
などを参考に、
class PageViewAnimationController: UIPageViewController,UIPageViewControllerDataSource {
lazy var idList: [UIViewController] = {
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
let V1 = storyBoard.instantiateViewController(withIdentifier: "第1段")
let V2 = storyBoard.instantiateViewController(withIdentifier: "第22段")
let V3 = storyBoard.instantiateViewController(withIdentifier: "第26段")
let V4 = storyBoard.instantiateViewController(withIdentifier: "第27段")
return[V1, V2, V3, V4]
}()
//最初からあるメソッド
override func viewDidLoad() {
self.dataSource = self
let middle = idList[1]
if idList.first != nil {
self.setViewControllers([middle], direction: .forward, animated: false, completion: nil)
}
}
//右ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
guard let vcIndex = idList.firstIndex(of: viewController) else {
return nil
}
let previousIndex = vcIndex - 1
guard previousIndex >= 0 else {
return nil
}
guard idList.count > previousIndex else {
return nil
}
return idList[previousIndex]
}
//左ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
guard let vcIndex = idList.firstIndex(of: viewController) else {
return nil
}
let nextIndex = vcIndex + 1
guard idList.count != nextIndex else {
return nil
}
guard idList.count > nextIndex else {
return nil
}
return idList[nextIndex]
}
}
も試してみたけど、改善なし💦
うーむ🤔
まあ、使わない機能だからいいんだけどね〜〜〜
と、コードを最初のコードに戻して、midは使わないので、maxに戻そ
![](https://assets.st-note.com/img/1680667593831-seEb7bcqHL.png?width=1200)
ブラッシュアップ
前準備で🌐ボタンはすでに付けていたので〜〜〜
記事公開後、
![](https://assets.st-note.com/img/1680667945657-rNfvMLZUw5.png?width=1200)
実機も問題無し🕺
Apple公式
さて次回は、
をレッツゴする🕺