UIButtonの上にUIViewを載せた時、ボタンが反応しなくなる問題の解決法

UIViewを上に重ねると下のUIButtonが押せなくなって困っておりました。

ちょっとややこしい状況なので、図で説明します。
![2016_12_2.png](https://qiita-image-store.s3.amazonaws.com/0/45467/d43f549e-afde-287c-b296-0578ebfc7060.png)

**２つ目のUIButtonがないのであれば**、上に載せたUIViewの
<img width="1069" alt="スクリーンショット_2016-12-02_15_30_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/f08a8247-f9ec-2c48-92c1-e7d5eb89891a.png">

しかし上にあるUIButtonも押せるようにしつつも、下のボタンも押せるようにする場合はこれではダメ。上のボタンが押せなくなる。

しかし案外簡単な方法で解決できることを
[こちらのサイト](http://oversleptabit.com/?p=1063)
で教えてもらいました。

こういうのって**タッチイベントの透過**って表現するんですね。知らなかった。

---
(なんとか解決できたけど、storyboardで思い通りにならない部分があってごちゃごちゃしてしまいました。ごめんなさい）

###先ずはハマってた状況を再現。storyboard上にボタンを載せます
<img width="798" alt="スクリーンショット 2016-12-02 13.11.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/a458c15c-79ac-d93d-711e-18bd8ddb2f26.png">
このままビルドした場合はもちろんボタンはタッチできます（ピコピコします）。

###しかしこうするとボタンが反応しなくなります。
<img width="799" alt="スクリーンショット 2016-12-02 13.12.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/ee6e9fab-75ed-75cf-b9f0-b81424be6841.png">

（ボタンの上にUIViewを載せてボタンが見えるようにalpha（透明度）を0.3にしました）
<img width="1070" alt="スクリーンショット_2016-12-02_13_55_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/80f36a35-fe3e-3788-43fd-a508570c4a3d.png">

そして上のUIViewにボタンを載せます。これも押せるようにしたい。
<img width="810" alt="スクリーンショット_2016-12-02_15_36_35.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/50c11fe6-ba55-f112-4c0c-c383711e4879.png">



##ここからが解決策
xcodeのメニューからFile->New->File...を選んでUIViewを継承したクラスを作ります
<img width="703" alt="スクリーンショット 2016-12-02 13.40.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/88d0051e-1751-c94b-fae4-1c8d63d841a3.png">

<img width="724" alt="スクリーンショット 2016-12-02 13.42.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/83f80320-4ab2-35d7-ce62-fabb2c5bf8bd.png">
（ちょっとファイル名が長いですけど、わかりやすさを優先しました。気にしないでください）

###作ったファイルの中にはこんなコードを書きました
<img width="953" alt="スクリーンショット 2016-12-02 16.13.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/b9cf524f-94b3-9222-c9ed-03a58bcc2016.png">

```
import UIKit

class TouchEventThroughView: UIView {

    // 上に載せたボタンのCGRect
    var rect_topButton : CGRect?
    
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        
        // 上のボタンの位置だったら透過させない
        if (rect_topButton!.contains(point)) {
            return true
        }
        
        // それ以外は透過させる
        return false
    }
}
```

###storyboardに「このUIViewはこのカスタムクラスですよ」と教えます
<img width="963" alt="スクリーンショット_2016-12-02_13_15_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/bbc4f60f-0980-2652-5b7b-9be77edd88ec.png">

###上のボタンのRectがカスタムクラス内で必要なので、ViewControllerに紐付けして、
（本当はボタンをTouchEventThroughViewのプロパティにしたかったのですが、なぜかctrlドラッグできなかったので仕方なく。。）
<img width="1212" alt="スクリーンショット_2016-12-02_16_15_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/b226dfc6-4f21-c7d2-7763-dd5c425c5e91.png">

###ボタンのRectを伝えるコードをViewControllerに書きます
```
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var touchEventThroughView: TouchEventThroughView!
    @IBOutlet weak var topButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        touchEventThroughView.rect_topButton = topButton.frame
    }
}
```

###ビルドしてみると、両方のボタンが押せるようになりました！

しかし、どうしてstoryboardでTouchEventThroughViewへのctrlドラッグができなかったのだろう？

おかげでちょっとごちゃごちゃしてしまいましたが、一応目的は達成できたので、とりあえずOK。