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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

5034閲覧

UIScrollView内でシングルタップ・ダブルタップのイベントが動作しない

Stephen_J

総合スコア18

iOS

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

1グッド

0クリップ

投稿2015/12/19 12:59

編集2015/12/19 17:29

前回、こちらで質問をさせていただき、
UIImageViewをUIScrollViewに入れることで、画像の拡大・縮小・移動が可能になりました。

しかし、ImageViewをシングルタップした時にタップしたポイントを取得する部分のコードがうまく動かなくなってしまいました。
(以下のコードのprint(pointX)及びprint(pointY)が出力されません。)
以下がViewController.swiftファイルの内容です。

ViewController.swift

1import UIKit 2 3class ViewController: UIViewController,UIScrollViewDelegate { 4 @IBOutlet weak var myScrollView: UIScrollView! 5 @IBOutlet weak var myImageView: UIImageView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 // スクロールビューの設定 11 self.myScrollView.delegate = self 12 self.myScrollView.minimumZoomScale = 1 13 self.myScrollView.maximumZoomScale = 8 14 self.myScrollView.scrollEnabled = true 15 self.myScrollView.showsHorizontalScrollIndicator = true 16 self.myScrollView.showsVerticalScrollIndicator = true 17 18 var doubleTapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action:"doubleTap:") 19 doubleTapGesture.numberOfTapsRequired = 2 20 self.myImageView.userInteractionEnabled = true 21 self.myImageView.addGestureRecognizer(doubleTapGesture) 22 } 23 24 override func didReceiveMemoryWarning() { 25 super.didReceiveMemoryWarning() 26 // Dispose of any resources that can be recreated. 27 } 28 29 // ピンチイン・ピンチアウト 30 func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { 31 print("pinch") 32 return self.myImageView 33 } 34 35 // ダブルタップ 36 func doubleTap(gesture: UITapGestureRecognizer) -> Void { 37 38 print(self.myScrollView.zoomScale) 39 if ( self.myScrollView.zoomScale < self.myScrollView.maximumZoomScale ) { 40 var newScale:CGFloat = self.myScrollView.zoomScale * 3 41 var zoomRect:CGRect = self.zoomRectForScale(newScale, center: gesture.locationInView(gesture.view)) 42 self.myScrollView.zoomToRect(zoomRect, animated: true) 43 } else { 44 self.myScrollView.setZoomScale(1.0, animated: true) 45 } 46 } 47 48 // 領域 49 func zoomRectForScale(scale:CGFloat, center: CGPoint) -> CGRect{ 50 var zoomRect: CGRect = CGRect() 51 zoomRect.size.height = self.myScrollView.frame.size.height / scale 52 zoomRect.size.width = self.myScrollView.frame.size.width / scale 53 54 zoomRect.origin.x = center.x - zoomRect.size.width / 2.0 55 zoomRect.origin.y = center.y - zoomRect.size.height / 2.0 56 57 return zoomRect 58 } 59 60 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 61 for touch: AnyObject in touches { 62 let point = touch.locationInView(self.view) 63 64 let pointX = point.x 65 let pointY = point.y 66 67 print(pointX) 68 print(pointY) 69 } 70 } 71}

色々と調べてみたところ、UIScrollViewを用いた際にUIPinchGestureRecognizerが優先され(?)、
それが原因でシングルタップ・ダブルタップが認識できなくなるのではないかと思ったのですが、
どのように処理すべきでしょうか?

Xcode7.2、Swift2.1、Storyboardを使用しています。

kmrkmr👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、前回の質問時に紹介した記事ですが、新しいプロジェクトにUIScrollViewとUIImageViewを配置して、記事にあったViewControllerのソースをそのままコピペして、myImageViewとmyScrollViewを接続してみたら、ピンチもダブルタップの3倍拡大も説明通り動作しました。
「動きません。どうすればいいですか」と聞かれても、あなたが何をどうやったか書かないとわかりません。
新しいプロジェクトで試してないならまずは記事通りのことを新しいプロジェクトで動かしてみることをお勧めします。それで動かないなら自分が何をやったかを詳しく説明してください。

あと、シングルタップが動作しなくなったとのことですが、上記の紹介記事のソースコードで
doubleTapGesture.numberOfTapsRequired = 2

doubleTapGesture.numberOfTapsRequired = 1
に変更するだけでシングルタップで3倍拡大するようになりますので、まずは新しいプロジェクトでそれが動作できることを確認してから、どうやってそれを自分のプロジェクトに組み込むか考えればよいと思います。

投稿2015/12/19 15:34

編集2015/12/19 15:40
TakeOne

総合スコア6299

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

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

Stephen_J

2015/12/19 17:34

>TakeOneさま アドバイスありがとうございます。 確かに、新規プロジェクトではピンチ・ダブルタップ共に動作することを確認しました。 今回動作させたかったのは「override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?){ code }」だという説明が不足しておりました。申し訳ありません。
TakeOne

2015/12/20 01:17

おっしゃられている通り、UIScrollViewがタッチイベントを処理してしまうため、ViewControllerにtouchesBeganを実装してもそれは呼ばれません。 では、なぜ紹介した記事のコードでシングルタップやダブルタップを検出できるのか、コードを読んで理解していますか?UIScrollViewの上のUIImageViewにUITapGestureRecognizerを追加することで、UIScrollViewが処理する前にタップを処理しているからです。 シングルタップを検出したいなら、この通りUITapGestureRecognizerを追加すればよいと思います。なぜtouchesBeganで処理したいのかわかりませんが、どうしてもtouchesBeganで処理したいのであれば、UIImageViewのサブクラスを作って、そこにtouchesBeganを実装すればよいです。そうすれば、UIScrollViewがタッチを処理する前にUIImageViewのサブクラスのtouchesBeganが呼ばれます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問