回答編集履歴

1

情報修正

2019/12/09 03:52

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -21,3 +21,127 @@
21
21
  単純にtapGestureを何個も作り、それぞれの部品に別のgestureを接続する方法と、
22
22
 
23
23
  各部品にtagをつけて、senderのtagで分岐する方法があります。
24
+
25
+
26
+
27
+ # 追伸
28
+
29
+ さらによく調べて、試してみました。
30
+
31
+ [stackOverflow](https://stackoverflow.com/questions/4747238/can-you-attach-a-uigesturerecognizer-to-multiple-views?rq=1)に答えがありました。
32
+
33
+ 自分も知りませんでしたが、tapGestureは同じインスタンスを使い回すことができないみたいです。
34
+
35
+ なので、UIView1個に対して、Gesture1個必要みたいです。
36
+
37
+ なので、同じGestureを使い回すと、最後の1個のみしか正しく動かないという現象が起きるみたいです。
38
+
39
+
40
+
41
+ 解決策としてはstackOverFlowにもありますが、
42
+
43
+ UITapGestureRecognizerを返す、private funcを作成してしまうことですね。
44
+
45
+ 下記にサンプル載せます。
46
+
47
+
48
+
49
+ ```Swift
50
+
51
+ import UIKit
52
+
53
+
54
+
55
+ class ViewController: UIViewController, UIGestureRecognizerDelegate {
56
+
57
+
58
+
59
+ @IBOutlet weak var labelA: UILabel!
60
+
61
+ @IBOutlet weak var labelB: UILabel!
62
+
63
+ @IBOutlet weak var labelC: UILabel!
64
+
65
+
66
+
67
+ private func setTapGesture() -> UITapGestureRecognizer {
68
+
69
+ let tap = UITapGestureRecognizer(target: self, action: #selector(tapped(_ :)))
70
+
71
+ tap.cancelsTouchesInView = true
72
+
73
+ return tap
74
+
75
+ }
76
+
77
+
78
+
79
+ override func viewDidLoad() {
80
+
81
+ super.viewDidLoad()
82
+
83
+ // Do any additional setup after loading the view.
84
+
85
+ self.labelA.tag = 100
86
+
87
+ self.labelB.tag = 200
88
+
89
+ self.labelC.tag = 300
90
+
91
+ self.labelA.isUserInteractionEnabled = true
92
+
93
+ self.labelB.isUserInteractionEnabled = true
94
+
95
+ self.labelC.isUserInteractionEnabled = true
96
+
97
+ self.labelA.addGestureRecognizer(setTapGesture())
98
+
99
+ self.labelB.addGestureRecognizer(setTapGesture())
100
+
101
+ self.labelC.addGestureRecognizer(setTapGesture())
102
+
103
+ }
104
+
105
+
106
+
107
+ @objc func tapped(_ sender: UITapGestureRecognizer) {
108
+
109
+ print("tapped tag:", sender.view?.tag)
110
+
111
+ switch sender.view?.tag {
112
+
113
+ case 100:
114
+
115
+ // ここで何かをする
116
+
117
+ break
118
+
119
+ case 200:
120
+
121
+ // ここで何かをする
122
+
123
+ break
124
+
125
+ case 300:
126
+
127
+ // ここで何かをする
128
+
129
+ break
130
+
131
+ default:
132
+
133
+ break
134
+
135
+ }
136
+
137
+ }
138
+
139
+
140
+
141
+ }
142
+
143
+
144
+
145
+ ```
146
+
147
+ 答えを修正します。