質問: ### 前提・実現したいこと Swift5初心者です.ストーリーボードは使っておりません. `UIPageViewController`を受けたクラスで `UIView`クラスの `touches.first.type`を使うことはできないのでしょうか. 現在,iPadで使うペイントアプリを開発しているのですが,そこでペンタブレットでタッチした時はキャンバスに線を描画し,指でスワイプをした時は別のキャンバスに移る,という処理を実装したいと考えています. 描画部分では想定通りの動き( `touchesBegan`や `touchesMoved`)ができていることは確認済みです. そしてスワイプ部分は現在 `UIPageViewController`で生成したインスタンスに複数の `UIView`インスタンス(キャンバス)を乗せる,という実装をしています. しかしこの `UIPageViewController`上でペンと指の判別ができないため,ペンで横線を書こうとするとそのままキャンバスの遷移が起こってしまっています(縦線はスワイプイベントが起こらないので描画ができます). ペンと指を区別するために `UIView`クラスの `touches.first.type`を使うことを考えたのですが,どう実装すれば `UIPageViewController`内でこれが使えるのかが分かりませんでした, この問題を解決するコード例や,機能実現の別のアイディア等を教えていただきたいです. (例えば, `UIView`の方が `UIPageViewController`より先に `touch`のイベントを受け取る方法など)
回答: こんにちは。 手元にペンもなく、できるか判らないのでアイディアだけ。 案1(たぶんできる) UIPageViewControllerはgestureRecognizersというプロパティを持っていますので、 その中からUIPanGestureRecognizerを探して無効化してしまう。 ページのめくりなどは自分でtouches系イベントで行う。 おそらくページがタッチに吸い付くようなめくり方はこれでは実現できないので、 そもそもUIPageViewControllerを使うメリットがない(トランジションのページカールエフェクトを使った方が手っ取り早い) 案2(検証しないとできるかわからない) UIPageViewControllerはgestureRecognizersというプロパティを持っていますので、 その中からUIPanGestureRecognizerを探してジェスチャのdelegateをself等に設定して動きをカスタマイズします。 UIGestureRecognizerDelegateの中ではそのタッチイベントをそのジェスチャが処理して良いか?という判定関数がありますので、 > > func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, > > shouldReceive touch: UITouch) -> Bool > > > ペンだったらfalseを返すようにすれば、ペンではめくれなくなるはずです。 #ただ、記憶が曖昧ですが、もとからdelegateにはnil以外の値が入っていたかもしれません。 #そしてそれはUIPageViewControllerインスタンスだったかもしれません。 #もしそうであれば、UIPageViewControllerを継承したクラスを作った方が良いかもしれません。 #(そうしないと普通に動いていた機能が正常に動かなくなるかもしれません) いろいろやってみてください。