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

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

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

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

Swift

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

Q&A

解決済

1回答

2846閲覧

UIImageViewでスワイプ時の処理を定義したい

bruteberry

総合スコア20

iOS

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

Swift

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

0グッド

0クリップ

投稿2017/01/05 05:15

編集2017/01/05 06:34

###前提・実現したいこと
UIImageviewにおいて、スワイプを検出したい.

###発生している問題・エラーメッセージ

オブジェクトライブラリから、「Swipe Gesture Recognizer」をUIImageViewにドラッグ&ドロップし、Attribute Inspectorからそれぞれスワイプの方向を選択し、コードにControlキーを押しながらドラッグ&ドロップしてIBActionでrightSwiped、leftSwipedとしてコネクトしました。

配列に格納された画像のURLを用いてスワイプで次々に画像を表示していくプログラムを作成するのが最終目的ですが、画像も変わりませんし、printもsearchLabelの文字も変わらないのでスワイプが検知されていない様です。
何がいけないのでしょうか?
画像を表示するプログラムの通信している部分の理解が浅いので、そこが原因かもしれません。
なにかアドバイスを頂けるとうれしいです。
よろしくお願いします。

###該当のソースコード

Swift3

1import UIKit 2 3class SearchViewController: UIViewController { 4 5 @IBOutlet weak var searchLabel: UILabel! 6 @IBOutlet weak var wordImage: UIImageView! 7 @IBAction func rightSwiped(_ sender: Any) { 8 if(imageSub != 0){ 9 imageSub = imageSub-1 10 } 11 if let url = URL(string: wordImageArray[imageSub]) { 12 let req = URLRequest(url: url) 13 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 14 if let data = data { 15 if let anImage = UIImage(data: data) { 16 DispatchQueue.main.async { 17 self.wordImage.image = anImage 18 } 19 } 20 } 21 }) 22 task.resume() 23 } 24 print("右") 25 searchLabel.text = "右" 26 } 27 28 @IBAction func leftSwiped(_ sender: Any) { 29 imageSub = imageSub+1 30 if let url = URL(string: wordImageArray[imageSub]) { 31 let req = URLRequest(url: url) 32 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 33 if let data = data { 34 if let anImage = UIImage(data: data) { 35 DispatchQueue.main.async { 36 self.wordImage.image = anImage 37 } 38 } 39 } 40 }) 41 task.resume() 42 } 43 print("左") 44 searchLabel.text = "左" 45 } 46 47 //関連画像URLを格納する配列 48 var wordImageArray: [String] = [String]() 49 50 //現在表示している画像の添字を格納する変数 51 var imageSub :Int = 0; 52 53 // APIを利用するためのアプリケーションID 54 let apikey: String = "??????????" 55 // let appid: String = "発行したアプリケーションIDをここに設定してください" 56 57 //APIを利用するためのサーチエンジンキー 58 let cx: String = "???????" 59 60 //利用するAPIのサーチタイプ 61 let searchType: String = "image" 62 63 // APIのURL 64 let entryUrl: String = "https://www.googleapis.com/customsearch/v1" 65 66 var resultconfirm: String = "0" 67 68 override func viewDidLoad() { 69 super.viewDidLoad() 70 71 let pasteboard = UIPasteboard.general 72 let copiedText = pasteboard.string 73 searchLabel.text = copiedText 74 // Do any additional setup after loading the view.qqqqq 75 76 // パラメータを指定する 77 let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":copiedText] 78 dump(parameter) 79 80 // パラメータをエンコードしたURLを作成する 81 let requestUrl = createRequestUrl(parameter: parameter as! [String : String]) 82 83 print("リクエストURLは"+requestUrl) 84 85 // APIをリクエストする 86 request(requestUrl: requestUrl) { result in 87 88 dump(result) 89 if let url = URL(string: self.wordImageArray[0]) { 90 let req = URLRequest(url: url) 91 let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 92 if let data = data { 93 if let anImage = UIImage(data: data) { 94 DispatchQueue.main.async { 95 self.wordImage.image = anImage 96 } 97 } 98 } 99 }) 100 task.resume() 101 } 102 } 103 } 104 105 override func didReceiveMemoryWarning() { 106 super.didReceiveMemoryWarning() 107 // Dispose of any resources that can be recreated. 108 } 109 110 111 // パラメータのURLエンコード処理 112 func encodeParameter(key: String, value: String) -> String? { 113 // 値をエンコードする 114 guard let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else { 115 // エンコード失敗 116 return nil 117 } 118 // エンコードした値をkey=valueの形式で返却する 119 return "\(key)=\(escapedValue)" 120 } 121 122 // URL作成処理 123 func createRequestUrl(parameter: [String: String]) -> String { 124 var parameterString = "" 125 for key in parameter.keys { 126 // 値の取り出し 127 guard let value = parameter[key] else { 128 // 値なし。次のfor文の処理を行なう 129 continue 130 } 131 132 // 既にパラメータが設定されていた場合 133 if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 { 134 // パラメータ同士のセパレータである&を追加する 135 parameterString += "&" 136 } 137 138 139 140 // 値をエンコードする 141 guard let encodeValue = encodeParameter(key: key, value: value) else { 142 // エンコード失敗。次のfor文の処理を行なう 143 continue 144 } 145 // エンコードした値をパラメータとして追加する 146 parameterString += encodeValue 147 148 } 149 let requestUrl = entryUrl + "?" + parameterString 150 return requestUrl 151 } 152 153 // 検索結果をパースして商品リストを作成する 154 func parseData(items: [Any], resultHandler: @escaping (([String]?) -> Void)) { 155 156 for item in items { 157 158 // レスポンスデータから画像の情報を取得する 159 guard let item = item as? [String: Any], let imageURL = item["link"] as? String else { 160 resultHandler(nil) 161 return 162 } 163 print(imageURL) 164 165 // 配列に追加 166 wordImageArray.append(imageURL) 167 } 168 169 resultHandler(wordImageArray) 170 dump(wordImageArray) 171 } 172 173 // リクエストを行なう 174 func request(requestUrl: String, resultHandler: @escaping (([String]?) -> Void)) { 175 // URL生成 176 guard let url = URL(string: requestUrl) else { 177 // URL生成失敗 178 resultHandler(nil) 179 return 180 } 181 182 // リクエスト生成 183 let request = URLRequest(url: url) 184 185 // APIをコールして商品検索を行なう 186 let session = URLSession.shared 187 let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in 188 // 通信完了後の処理 189 190 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "") 191 192 // エラーチェック 193 guard error == nil else { 194 // エラー表示 195 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) 196 197 // UIに関する処理はメインスレッド上で行なう 198 DispatchQueue.main.async { 199 self.present(alert, animated: true, completion: nil) 200 } 201 resultHandler(nil) 202 return 203 } 204 205 // JSONで返却されたデータをパースして格納する 206 guard let data = data else { 207 // データなし 208 resultHandler(nil) 209 return 210 } 211 212 // JSON形式への変換処理 213 guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else { 214 // 変換失敗 215 resultHandler(nil) 216 return 217 } 218 219 // データを解析 220 guard let resultSet = jsonData["items"] as? [Any] else { 221 // データなし 222 resultHandler(nil) 223 return 224 } 225 self.parseData(items: resultSet, resultHandler: resultHandler) 226 } 227 // 通信開始 228 task.resume() 229 } 230} 231

###試したこと
Storyboardを使わない方法など、他のブログも参考にしてみましたがうまくいきません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

UIImageViewは、デフォルトではタッチが効かないようになっているので、Attributes inspectorのViewにあるUser Interaction Enabledを有効にして下さい。

コードの場合は、

swift

1imageView.isUserInteractionEnabled = true

ところで、Storyboard上だと、UIImageViewの上に乗せられなくないですか?

投稿2017/01/05 05:48

編集2017/01/05 07:12
fuzzball

総合スコア16731

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

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

fromageblanc

2017/01/05 06:09

↑をtrueにしてinfo.plistにApp Transport Security Settingsを書いたら、私の環境では正常動作しました。
fuzzball

2017/01/05 06:15

テストありがとうございます。スワイプ以外は全く見てませんでしたw
fromageblanc

2017/01/05 06:17

ちなみにスワイプしまくると落ちます。。。まあ設計の話ですね。あとapikeyは晒さないほうがよいのではと。
bruteberry

2017/01/05 06:32

>>Storyboard上だと、UIImageViewの上に乗せられなくないですか? そうなのですか? ユーティリティエリアのConnection InspectorをみるとReferencing Outlet Collectionsのところが gesturedRecognizers --- Word Image(UIImageViewの名前です) となっていたので、「できた!」とか思ってました...。 おっしゃられたとおりにしたら動くようになりました!!!! 本当にありがとうございました!!!! たぶん11回目のスワイプで落ちると思います!! 引き続き作っていきたいと思いますありがとうございます。 apikey消しておきますご忠告ありがとうございます。
fuzzball

2017/01/05 06:39

乗せられない件は私の勘違いのようなので忘れて下さい。
fromageblanc

2017/01/05 06:39

isUserInteractionEnabledはストボーのインスペクタからも設定できますよ。ImageViewはデフォルトfalseです。
bruteberry

2017/01/05 06:52

コメントありがとうございます忘れます インスペクタから設定できるものだったのですね..。 次からはインスペクタを全部チェックするようにします。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問