質問編集履歴

2

コードの追記、shouldReceiveTouchについて

2017/11/07 11:07

投稿

mitci
mitci

スコア37

test CHANGED
File without changes
test CHANGED
@@ -66,6 +66,62 @@
66
66
 
67
67
 
68
68
 
69
+ ###追記 shouldReceiveTouchメソッド
70
+
71
+ ``shouldReceiveTouch``メソッドについては以下のように導入しました。
72
+
73
+ [こちら](https://qiita.com/akatsuki174/items/379d608695bedfa60cc1)を参照しました。
74
+
75
+
76
+
77
+ ```swift
78
+
79
+ class ViewController: UIViewController, UIGestureRecognizerDelegate {
80
+
81
+ //デリゲートに批准して、
82
+
83
+ override func viewDidLoad() {
84
+
85
+ super.viewDidLoad()
86
+
87
+ //省略
88
+
89
+ tapGesture.cancelsTouchesInView = false
90
+
91
+ tapGesture.delegate = self
92
+
93
+ //デリゲートを指定し、
94
+
95
+ }
96
+
97
+
98
+
99
+ func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
100
+
101
+ if (touch.view?.isDescendant(of: subView))! {
102
+
103
+ return false
104
+
105
+ }
106
+
107
+ return true
108
+
109
+ }
110
+
111
+ //メソッドを導入
112
+
113
+ ```
114
+
115
+
116
+
117
+ これ以外にはコードはいじっていません・・・
118
+
119
+ ``tapGesture.cancelsTouchesInView = false``や``touch.view?.isDescendant(of: subView)``の当たりなども理解ができていないまま、ただ書いてあった通りに導入したところがあるので、何が間違いか正直わかっていないところです・・・。
120
+
121
+
122
+
123
+ ただ、上記コードを書き加えても、子ビューに触れるとジェスチャーメソッドが呼ばれてしまい、状況によっては``UISlider``のツマミに触れるとアプリがクラッシュしてしまうこともありました。
124
+
69
125
  ###補足情報(言語/FW/ツール等のバージョンなど)
70
126
 
71
127
  swift3 xcode8

1

改善

2017/11/07 11:07

投稿

mitci
mitci

スコア37

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,27 @@
1
+ ###実現したいこと
2
+
3
+ 親ビューにaddした``UITapGestureRecognizer``を**親ビューでのみ有効**にし、子ビューはジェスチャーを全く無効化し、``UISlider``などがきちんと動くようにしたいです。
4
+
5
+
6
+
7
+
8
+
9
+ 親ビューの``UITapGestureRecognizer``を子ビュー内では働かないようにする
10
+
11
+ -> ``UISlider``の微小なツマミ移動とタップジェスチャーが競合し、タップジェスチャーが優先されてしまう
12
+
13
+ 何の対策もしない
14
+
15
+ -> 子ビューの``UIButton``部分以外の部分(``UISlider``のツマミなども含む)をタップするとジェスチャーメソッドが呼ばれてしまう
16
+
17
+ となってしまいます。
18
+
19
+
20
+
21
+ とにかく、**__親ビューにaddしたジェスチャーメソッドを子ビューに完全に反映しない__**ようにしたいです。
22
+
23
+
24
+
1
25
  ###前提
2
26
 
3
27
  Swift3で親ビューに``UITapGestureRecognizer``をaddして、
@@ -32,26 +56,6 @@
32
56
 
33
57
 
34
58
 
35
- ###実現したいこと
36
-
37
- 親ビューにaddした``UITapGestureRecognizer``を**親ビューでのみ有効**にし、子ビューはジェスチャーを全く無効化し、``UISlider``などがきちんと動くようにしたいです。
38
-
39
-
40
-
41
- 現時点で
42
-
43
- 親ビューの``UITapGestureRecognizer``を子ビューで排除 -> ``UISlider``の動きがおかしい
44
-
45
- 何の対策もしない -> 子ビューの``UIButton``部分以外をタップするとジェスチャーメソッドが呼ばれてしまう
46
-
47
-
48
-
49
- となってしまいます。
50
-
51
-
52
-
53
- とにかく、**__親ビューにaddしたジェスチャーメソッドを子ビューに完全に反映しない__**ようにしたいです。
54
-
55
59
 
56
60
 
57
61
  ###試したこと