25244


添付の画像のように、FacebookやInstagram,
TwitterなどのサービスではTableViewなどのCellをタップして詳細を見るVCへSegueで遷移させています。  
そのdestinationViewController(以下「詳細VC」)から、元のViewController(以下「一覧VC」)に戻る時に2種類手段を用意している認識なのですが、

  1. 左上のBackボタン
  2. SwipeもしくはVCを長めにPressしてUnwind Segueをcallする

2の場合の長めにVCをpressした場合に詳細VCを左右自由に動かせるようになっていると思うのですが、これはどのように実現されるのでしょうか。  
swipeで呼ぶ場合は、unwind
segueをcallして単純に戻れると思うのですが、長めにpressした場合は、途中まで詳細VCを右に動かして、左に戻すといったことができますが、方法がわかりません。  
おわかりになる方教えていただけませんでしょうか。よろしくお願いいたします。  
[![Twitter](https://i.stack.imgur.com/QFxqa.png)](https://i.stack.imgur.com/QFxqa.png)

↑unwind segueを途中でとめたりコントロールすることができる


CC BY-SA 3.0
2016-05-27T18:27:04.833
25231
2016-05-28T12:09:29.147
15172
question
swift ios swift2
Unwind Segueを途中でとめたりコントロールできるようにしたい


スクリーンショットを載せられているTwitterの場合ですが、単純に、画面の左半分から右方向にスワイプされたときにViewControllerを移動させているだけではないでしょうか？
あとは、指を離された位置に応じて、ViewControllerを元の位置に戻すか、前の画面に戻るかを判断しているだけのように思われます。

内部の仕組みとしてはUINavigationControllerが標準で持っているSwipeで戻る機能を使っていて、Swipeを始められる範囲を広げてあるように見えますが・・・
詳しい事は、アプリの開発者に聞いてみないとわからないかと。

Unwind SegueじゃなくてpopToViewControllerを使ってるような気はしますが。


CC BY-SA 3.0
2016-05-28T11:39:20.650
25243
2016-05-28T11:39:20.650
7459
25231
answer


`UINavigationController`を利用して表示すれば、デフォルトでそのような見た目になります。

これはインタラクティブ画面遷移と呼ばれる仕組みで実現されています。

原理としては単純で、`UINavigationController`を利用して表示した`UIViewController`は、自動的にビューに`UIScreenEdgePanGestureRecognizer`が付与されているのです。

この`UIScreenEdgePanGestureRecognizer`は、エッジスワイプの量に応じて、2つのView
Controllerのトランジションを制御しています。

このトランジションの実装は、公式ドキュメントの[View Controller Programming Guide for
iOS](https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/)の、Customizing
the Transition Animationsを参照してみてください。

日本語でも検索すれば出てくると思いますが、恐らくこれが実装されたiOS7の頃のObjective-
Cで書かれた解説ばかりかもしれません（こうした細かなトピックスに関して、iOS9対応/Swift2で記述された情報はまずないです）。


CC BY-SA 3.0
2016-05-28T12:09:29.147
25244
2016-05-28T12:09:29.147
5337
25231
answer