質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1771閲覧

PDFViewで画面端からのスワイプのジェスチャーを検出したい。しかし、PDFViewがズームされていると、ジェスチャーが検出されてなくて困っています

sekiseki_2

総合スコア2

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/10/26 02:53

編集2021/10/27 01:51

SwiftでiOSでのPDFを表示させるアプリを作成しています。

下記のコードのようにGestureを追加し、画面の端からスワイプすることで、ページが移動できるようにしました。
ところが、PDFが画面のサイズよりも大きくズームインされているときには、なぜかスワイプでページ移動をすることができません。どうやら、スワイプを検知することすらされていないようです。

ズームインされているときにも画面端からのスワイプの動きを検出するようにするには、どうしたらよいのでしょうか?
ご教示いただけますと大変助かります。

swift

1 override func viewDidLoad(){ 2 super.viewDidLoad() 3 4 //橋からのスワイプを検出する 5 let leftScreenEdgeRecognizer = UIScreenEdgePanGestureRecognizer ( 6 target: self, action: #selector(TextDocumentViewController.leftEdgePanGestureHandler(_ : ))) 7 leftScreenEdgeRecognizer.edges = UIRectEdge.left 8 9 let rightScreenEdgeRecognizer = UIScreenEdgePanGestureRecognizer ( 10 target: self, action: #selector(TextDocumentViewController.rightEdgePanGestureHandler(_ : ))) 11 rightScreenEdgeRecognizer.edges = UIRectEdge.right 12 13 //ジェスチャーを登録する 14 pdfView.addGestureRecognizer(leftScreenEdgeRecognizer) 15 pdfView.addGestureRecognizer(rightScreenEdgeRecognizer) 16 17 //ネットでググって、以下のコードを入れてみたのですが挙動に変化がありませんでした。。。 18 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 19 return true 20 } 21 22} 23 24 25 26//ジェスチャーが行われたとき。。 27@objc func leftEdgePanGestureHandler(_ sender: UIScreenEdgePanGestureRecognizer){ 28 if(sender.state == UIGestureRecognizer.State.ended){ 29 print ("Left Edge") 30 // ズームされているときに、ズームの比率を保存 31 scaleOfPdf = pdfView.scaleFactor 32 pdfView.goToPreviousPage(sender) 33 pdfView.scaleFactor = scaleOfPdf 34 } 35 36} 37 38@objc func rightEdgePanGestureHandler(_ sender: UIScreenEdgePanGestureRecognizer){ 39 if(sender.state == UIGestureRecognizer.State.ended){ 40 print ("right Edge") 41 // ズームされているときに、ズームの比率を保存 42 scaleOfPdf = pdfView.scaleFactor 43 pdfView.goToNextPage(sender) 44 pdfView.scaleFactor = scaleOfPdf 45 } 46}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

下記のように、Multple gesture recognizerを設定することができました。
私がしっかりと行っていなかったのは、Gestureを登録した際に、そのDelegateを指定することだったようです。

swift

1class ViewController: UIViewController, UIGestureRecognizerDelegate, UIDocumentPickerDelegate, PDFViewDelegate { 2// ... そのほかのコード 3 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 4 shouldRecognizeSimultaneouslyWith otherGestureRecognizer: 5 UIGestureRecognizer) -> Bool { 6 return true 7 } 8} 9 10 11override func viewDidLoad(){ 12 super.viewDidLoad() 13 14 //ジェスチャーのDelegateを指定 15 leftScreenEdgeRecognizer.delegate = self 16 rightScreenEdgeRecognizer.delegate = self 17}

投稿2021/10/27 13:52

sekiseki_2

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

usePageViewController(_:withViewOptions:) を使うと、期待された動作に近い挙動になると思います。
以下のような実装ではいかがでしょうか?

swift

1import UIKit 2import PDFKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet private weak var pdfView: PDFView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 pdfView.autoScales = true 12 pdfView.displayDirection = .horizontal 13 pdfView.usePageViewController(true, withViewOptions: nil) 14 15 guard 16 let url = Bundle.main.url(forResource: "sample", withExtension: "pdf"), 17 let document = PDFDocument(url: url) 18 else { 19 return 20 } 21 pdfView.document = document 22 } 23}

投稿2021/10/26 18:31

__k_san__

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekiseki_2

2021/10/27 01:40 編集

ご回答ありがとうございます!`pdfView.usePageViewController(true, withViewOptions: nil)`を使った場合には、ページを移動した際に、ズームの比率が元に戻ってしまう様でした。説明が不足していたのですが、一度ズームをしたときに、そのZoom比率で画面を表示できるようにしたいのです。そのために、ジェスチャーを使っての画面遷移ができれば、と考えております。このような、PDFView(UIView)を使った場合には、PDFViewのジェスチャーと、自作のジェスチャーは共存させる方法はないのでしょうか?もし、何かご存じでしたら、ご教示いただけますと大変幸いです。
sekiseki_2

2021/10/27 13:50

いろいろと試している内に、下記のように問題を解決することができました。__K_san__様、お知恵をお貸しいただきましてありがとうございました。
__k_san__

2021/10/27 14:00

わざわざコメントいただきありがとうございます。 無事解決できてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問