Swift UIPageViewControllerにタイマーを設定して、5秒ごとに画面遷移を繰り返したい
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 2,406
現在、UIPageViewControllerを使用して、無限画面遷移を行なってます。
これにタイマーを設定して、5秒毎に画面遷移を行うようにしたいです。
もちろん、スワイプでの画面遷移も機能するようにしたいです。
どのようにすればいいのか全く見当がつきません。
どなたかご教授願います。
宜しくお願い致します
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
let pageList = ["firstViewController", "secondViewController", "thirdViewController"]
override func viewDidLoad() {
super.viewDidLoad()
self.automaticallyAdjustsScrollViewInsets = false
//最初のビューコントローラーを取得する。
let controller = storyboard!.instantiateViewController(withIdentifier: pageList.first!)
//ビューコントローラーを表示する。
self.setViewControllers([controller], direction: .forward, animated: true, completion:nil)
self.dataSource = self
self.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//右ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
let index = pageList.index(of: viewController.restorationIdentifier!)!
if (index > 0) {
//前ページのビューコントローラーを返す。
return storyboard!.instantiateViewController(withIdentifier: pageList[index-1])
} else if (index == 0) { //もし一番最初の画面なら最後の画面を持ってくる
return storyboard!.instantiateViewController(withIdentifier: pageList[2])
}
return nil
}
//左ドラッグ時の呼び出しメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
//現在のビューコントローラーのインデックス番号を取得する。
let index = pageList.index(of: viewController.restorationIdentifier!)!
if (index < pageList.count-1) {
//次ページのビューコントローラーを返す。
return storyboard!.instantiateViewController(withIdentifier: pageList[index+1])
} else if (index == pageList.count-1) {
return storyboard!.instantiateViewController(withIdentifier: pageList[0])
}
return nil
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
Swift3でTimerはこのように変わりました
weak var timer: Timer!
...
timer = Timer.scheduledTimer(
timeInterval: 5.0,
target: self,
selector: #selector(self.timerCounter),
userInfo: nil,
repeats: true)
...
func timerCounter() {
// 遷移
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
swiftだとNSTimerってやつを使うといいかと思います。
let timer = Timer(timeInterval: 0.5, target: self, selector: #selector(test), userInfo: nil, repeats: true)
こんな感じのコードを書くと5秒ごとにself.changeView()を呼び続けるはずです。
swift NSTimer とかで調べると色々出てくるかと思います!
不明な点あればコメントください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
下記みたいに書けばとりあえず動きます。参考にどうぞ。
//ViewDidLoadとかに書いてください
let userInfo = ["UIPageViewController":UIPageViewController(), "UIViewController": UIViewController()]
let timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.pageViewController(tm:)), userInfo: userInfo, repeats: true)
timer.fire()
func pageViewController(tm: Timer){
guard let userInfo = tm.userInfo as? Dictionary<String, AnyObject> else{
return
}
//下記のように取り出して使うことができます。
print(userInfo["UIPageViewController"] as? UIPageViewController)
print(userInfo["UIViewController"] as? UIViewController)
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.38%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/15 15:34
最近使っていなかったので、情報が古かったですね。
2017/02/15 16:06
#selectorの部分を変更して、
timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.pageViewController(_:viewControllerAfter:)), userInfo: nil, repeats: true)
としてみたのですが、画面遷移しませんでした。
func timerCounter() {
// 遷移
}
を用意して、新しく記述しなければいけないのでしょうか?
初心者で申し訳ございません。
宜しくお願い致します。
2017/02/15 16:19
機能が残っているだけマシなAPIですね、完全に消え去る機能もありますから(汗
2017/02/15 16:22
尚、timerCounter()は適当につけた名前です
2017/02/15 16:28
失礼、画面遷移はこの場合pageViewControlleを呼ぶのではなくその中身の機能部分を書くか
Segueで遷移させるとかでしょう
2017/02/15 18:21
var index = 0
weak var timer: Timer!
...
timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.timerCounter), userInfo: nil, repeats: true)
...
//時間が来た時の動作
func timerCounter() {
if index < 2{
index = index + 1
}else{
index = 0
}
let controller = storyboard!.instantiateViewController(withIdentifier: pageList[index])
self.setViewControllers([controller], direction: .forward, animated: true, completion:nil)
}
あとは、スワイプしたときにタイマーをリセットするようにすれば完成です!
本当にありがとうございます^^