回答編集履歴

1

回答追加

2016/04/13 06:06

投稿

TakeOne
TakeOne

スコア6299

test CHANGED
@@ -15,3 +15,101 @@
15
15
  3.BaseViewの中にUIButtonを貼り付ける。(このUIButtonをアニメーションさせる)
16
16
 
17
17
  これで、アニメーション中のUIButtonをタップするとTouchDownイベントが発生すると思います。
18
+
19
+
20
+
21
+ ---
22
+
23
+ (4/13 15:00追記)
24
+
25
+ 追伸します。
26
+
27
+ その記事通りにできるかどうかちょっと試してみたところ、hitTestは複数回発生することがあるのでTouchDownイベントも複数回発生してしまうようです。それで問題ないならこのまま使えば良いと思いますが、通常、ボタンのタップはタッチを離した時(TouchUpInside)に検出するものという点も気になるので、その点を含めて代替案を作ってみました。
28
+
29
+
30
+
31
+ ```swift
32
+
33
+ import UIKit
34
+
35
+
36
+
37
+ class BaseView: UIView {
38
+
39
+
40
+
41
+ override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
42
+
43
+ let touchPoint = touches.first!.locationInView(self)
44
+
45
+ for subView in self.subviews {
46
+
47
+ if subView is UIButton {
48
+
49
+ let layer = subView.layer.presentationLayer() as! CALayer
50
+
51
+ if CGRectContainsPoint(layer.frame, touchPoint) {
52
+
53
+ let button = subView as! UIButton
54
+
55
+ button.sendActionsForControlEvents(.TouchDown)
56
+
57
+ }
58
+
59
+ }
60
+
61
+ }
62
+
63
+ }
64
+
65
+
66
+
67
+ override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
68
+
69
+ let touchPoint = touches.first!.locationInView(self)
70
+
71
+ for subView in self.subviews {
72
+
73
+ if subView is UIButton {
74
+
75
+ let layer = subView.layer.presentationLayer() as! CALayer
76
+
77
+ if CGRectContainsPoint(layer.frame, touchPoint) {
78
+
79
+ let button = subView as! UIButton
80
+
81
+ button.sendActionsForControlEvents(.TouchUpInside)
82
+
83
+ }
84
+
85
+ }
86
+
87
+ }
88
+
89
+ }
90
+
91
+ }
92
+
93
+ ```
94
+
95
+
96
+
97
+ 1.BaseViewを上記のコードで作成する。(hitTestは実装しない)
98
+
99
+ 2.StoryboardにUIViewを貼り付け、そのクラスをBaseViewに変更する。
100
+
101
+ 3.BaseViewの中にUIButtonを貼り付ける。(このUIButtonをアニメーションさせる)
102
+
103
+ 4.貼り付けたUIButtonの「User Interaction Enabled」のチェックをOFFにする。
104
+
105
+
106
+
107
+ これでボタンの上でタッチ開始した時にTouchDownが発生し、ボタンの上でタッチを離した時にTouchUpInsideが発生すると思います。
108
+
109
+ もうちょっとちゃんとするなら、タッチ開始時にボタンをキャプチャして、ボタンの表示をハイライトにし、タッチを離した時にボタン内ならTouchUpInsideを発生させ、ボタン外で離したらTouchUpOutsideを発生させないといけないですが、そこまで求めているかどうかわからないので、ここまでにしておきます。
110
+
111
+ 必要なら上記コードを改造してタッチ中のボタンをキャプチャする実装にすればさほど難しくなくできると思います。
112
+
113
+
114
+
115
+