🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

587閲覧

UIImageViewを識別する方法

mum

総合スコア17

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/12/11 09:17

実現したいこと

SwiftでStoriyBoardを使わずに神経衰弱のようなアプリを作成しています。

発生している問題

UIImageを25個Viewに表示させ、それぞれにタグを設定しました。
gestureTapメソッドというのを作り、UIImageをタップしたときに1回目タップした時のタグを変数num01に代入し,
num01と2回目にタップしたUIImageViewのタグの合計が25になったときに、カードが揃った時の判定にしようと思っているんですが、
最後にタップしたUIImageしか処理することができません。
1回目にタップしたUIImageViewを識別して処理する方法がわかりません。

かいつまんで、無理やり書くと下のような処理がしたいです。

swift

1var vw: UIImageView! // UIImageViewインスタンス生成 2num01 = 1 // 3vw.tag = num01 // タグを取得 4vw.num01(tagのこと).image = nil // 取得したタグで判別してimageをnilにする

なにか、良い方法があればご教授願います。

該当のソースコード

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // UIImageViewインスタンス作成 6 var vw: UIImageView! 7 // カード1枚目のタグを保持 8 var num01 = 0 9 // 1枚目の選択: true 2枚目: false 10 var flg = true 11 // タグを配列に格納 12 var tgArray: [Int] = [] 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 makeImage() 18 } 19 20 21 // カードの生成 22 func makeImage() { 23 24 let length = 65 25 var tg: Int = 1 26 27 // カードを25枚生成 28 for y in 0...4 { 29 30 let ay = 150 + (length * y) 31 32 for x in 0...4 { 33 34 let ax = 38 + (70 * x) 35 36 // イメージビューの設定 37 vw = UIImageView(frame: CGRect(x: ax, y: ay, width: length, height: length)) 38 vw.image = UIImage(named: "mum01_shadow") 39 vw.tag = tg 40 tgArray.append(tg) 41 tg += 1 42 view.addSubview(vw) 43// print(tg, vw.tag, tgArray) 44 45 // タップジェスチャーの設定 46 vw.isUserInteractionEnabled = true 47 48 let ges = UITapGestureRecognizer( 49 target: self, 50 action: #selector(gestureTap(sender:))) 51 vw.addGestureRecognizer(ges) 52 53 } 54 55 } 56 } 57 58 59 // カードをタップした時の処理 60 @objc func gestureTap(sender: UITapGestureRecognizer) { 61 // vwでnilをreturnしつつUIImageViewを取り出している 62 guard let vw = sender.view as? UIImageView else { return } 63 64 // 1枚目の選択 65 if flg { 66 num01 = vw.tag 67 vw.image = UIImage(named: "mum01") 68 flg = false 69 } else { 70 // 2枚目の選択 71 print("なむ(num01), たぐ(vw.tag)", num01 + vw.tag) 72 73 if num01 + vw.tag == 25 { 74 // カードが揃った時の処理 75 vw.image = UIImage(named: "mum01") 76 77 /*------------------------------------------ 78 ここで1枚目に選択したUIImageViewをnilにしたい! 79 ------------------------------------------ */ 80 81 vw.image = nil 82 flg = true 83 } else { 84 // カードが揃わなかった時の処理 85 vw.image = UIImage(named: "mum01_shadow") 86 flg = true 87 } 88 } 89 print(vw.tag) 90 } 91 92}

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

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

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

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

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

mum

2019/12/11 10:47

回答ありがとうございます。 Collection Viewというものがどういうものなのか知らないので、まず参考記事読んでみます。
hameji

2019/12/12 12:33

確かにcollectionViewにしたら、やろうとしていることもっと楽に実現できますよ。
mum

2019/12/12 13:12

回答ありがとうございます! プログラミング学習中で、どういう風に動いているかを確認しながら作りたいと思っていまして。 そんなに便利な部品なんですねcollectionView。 ひと段落着いたら触ってみようと思います。
guest

回答1

0

ベストアンサー

仕様は少し違うかもしれません。二番目のタップ周りのロジックをサンプルにてください。
基本的にマスターデーターを生成して、タップする時にこのデーターと比べて、結果によって分岐します。
一番目のタップをベットに管理する必要もありますね。

swift

1// 2// ViewController.swift 3// mindGame 4// 5// Created by リヴォーフ ユーリ on 2019/12/12. 6// Copyright © 2019 リヴォーフ ユーリ. All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController { 12 13 //マスターデーター 14 var pairData: [Int] = [] 15 //カード配列 16 var vws: [UIImageView] = [] 17 // UIImageViewインスタンス作成 18 var vw: UIImageView! 19 // カード1枚目のタグを保持 20 var num01 = 0 21 // 1枚目の選択: true 2枚目: false 22 var flg = true 23 //First tap value 24 var firstTapValue: Int = 0 25 //First tap tag 26 var firstTapTag: Int? = nil 27 28 //画像名 29 var imageOne: String = "lomonosov" 30 var imageTwo: String = "lovedeathrobots" 31 32 // タグを配列に格納 33 var tgArray: [Int] = [] 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 38 makeImage() 39 creataMasterData() 40 } 41 42 //マスターデーターを作成します 43 func creataMasterData() { 44 print(vws.count/2) 45 while pairData.count < vws.count { 46 let randomNum = Int.random(in: 1...(vws.count/2)) 47 let count = pairData.filter {$0 == randomNum}.count 48 if count < 2 { 49 pairData.append(randomNum) 50 } 51 } 52 print(pairData.description) 53 } 54 55 // カードの生成 56 func makeImage() { 57 58 let length = 65 59 var tg: Int = 0 60 61 // カードを25枚生成 62 for y in 0...5 { 63 64 let ay = 150 + (length * y) 65 66 for x in 0...3 { 67 68 let ax = 38 + (70 * x) 69 70 // イメージビューの設定 71 vw = UIImageView(frame: CGRect(x: ax, y: ay, width: length, height: length)) 72 vw.image = UIImage(named: imageOne) 73 vw.tag = tg 74 tgArray.append(tg) 75 tg += 1 76 view.addSubview(vw) 77 // タップジェスチャーの設定 78 vw.isUserInteractionEnabled = true 79 80 let ges = UITapGestureRecognizer( 81 target: self, 82 action: #selector(gestureTap(sender:))) 83 vw.addGestureRecognizer(ges) 84 vws.append(vw) 85 } 86 87 } 88 } 89 90 91 // カードをタップした時の処理 92 @objc func gestureTap(sender: UITapGestureRecognizer) { 93 // vwでnilをreturnしつつUIImageViewを取り出している 94 guard let vw = sender.view as? UIImageView else { return } 95 96 // 1枚目の選択 97 if flg { 98 vw.image = UIImage(named: imageTwo) 99 flg = false 100 firstTapValue = pairData[vw.tag] 101 firstTapTag = vw.tag 102 } else { 103 // 2枚目の選択 104 if pairData[vw.tag] == pairData[firstTapTag!] { 105 // カードが揃った時の処理 106 vw.image = UIImage(named: imageTwo) 107 flg = true 108 } else { 109 // カードが揃わなかった時の処理 110 vw.image = UIImage(named: imageOne) 111 vws[firstTapTag!].image = UIImage(named: imageOne) 112 firstTapTag = nil 113 flg = true 114 } 115 } 116 } 117} 118

イメージ説明

投稿2019/12/12 04:19

vanderlvov

総合スコア687

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

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

mum

2019/12/12 13:04

ありがとうございます! vanderlvovさんが書いてくれたコードを参考にいじってみます。 僕のコードにはUIImageView型の配列がないので、書いてみようと思います。 2枚目のタップの処理については、上のコードには書いていないんですが、カード25枚なので1〜25のタグ配列を用意しています。 それと別でimgの辞書型の配列も用意し、辞書のキーをカードのタグと合わせて使おうと思っています。 ```     // タグの配列 var tgArray: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] // イメージの配列 let imgs = [1: "img1",2: "img2",3: "img3",4: "img4",5: "img5", 6: "img6",7: "img7",8: "img8",9: "img9",10: "img10",11: "img11", 12: "img12",13: "img12", 14: "img11", 15: "img10", 16: "img9", 17: "img8", 18: "img7", 19: "img6", 20: "img5", 21: "img4", 22: "img3", 23: "img2", 24: "img1", 25: "img13"] ``` タグ1とタグ24を同じ画像(img1) // tag1 + tag24 == 25 タグ2とタグ23を同じ画像(img2) // tag2 + tag23 == 25 タグ3とタグ22を同じ画像(img3) // tag3 + tag22 == 25 タグ4とタグ21を同じ画像(img4) // tag4 + tag21 == 25 タグ5とタグ20... 略.... タグ12とタグ13を同じ画像(img12) // tag12 + tag13 == 25 (タグ25だけあまるようにしていて、何かスペシャルカードにしようと思っています。) なので、1枚目にタップしたタグと2枚目にタップしたタグの合計が25になったときにペアに なるので、今は下のように書いています ``` // カードをタップした時の処理 @objc func gestureTap(sender: UITapGestureRecognizer) { // vwでnilをreturnしつつUIImageViewを取り出している guard let vw01 = sender.view as? UIImageView else { return } // 1枚目の選択 if flg { num01 = vw01.tag vw01.image = UIImage(named: imgs[num01]!) flg = false } else { // 2枚目の選択 if num01 + vw01.tag == 25 { // カードが揃った時の処理 vw01.image = UIImage(named: imgs[vw01.tag]!) vw01.removeFromSuperview() flg = true } else { // カードが揃わなかった時の処理 vw01.image = UIImage(named: "mum01_shadow") flg = true } ``` わかりにくかったら申し訳ないですが、こんな感じです。
vanderlvov

2019/12/13 07:57

1回目のタップをどうやって保管できるの部分だけで参考になったらOKです。 事例のゲームのルールは全然違うけど、アプローチは似ています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問