質問: UIImage(named: "maru.png")! maruBtn.setBackgroundImage(maruBtnImage, forState: .Normal) maruBtn.addTarget(self, action: #selector(KenteiViewController.maruBtnTap(_:)), forControlEvents:.TouchUpInside) func maruBtnTap(sender: UIButton){ //押した時の処理をいろいろ書いてます } ```
回答: TouchUpInsideのイベントは確かに部品のちょっと外側でタッチを離してもイベントが発生するようですね。 そこで、TouchUpInsideイベントをもらった時に、タッチしていた場所がボタンの内側か外側か判定して 内側だった時だけ処理すればいいと思います。 TouchUpInsideイベントでタッチしていた場所を取得するには、イベントを接続する時に表示されるダイアログで、以下のようにArgumentsに「Sender and Event」を指定します。 !イメージ説明 すると、次のようなパラメータ形式のイベント処理メソッドが生成されますので ``` @IBAction func touchUpInside_button(sender: AnyObject, forEvent event: UIEvent) { } ``` あとは、eventパラメータの中にあるタッチ座標を取り出して、それがボタンの範囲内かどうか判断すればいいです。 サンプルコードを示します。 ``` @IBAction func touchUpInside_button(sender: AnyObject, forEvent event: UIEvent) { let button = sender as! UIButton let touch = event.touchesForView(button)?.first let point = touch?.locationInView(button) if CGRectContainsPoint(button.bounds, point!) { print("ボタンの内側") } else { print("ボタン外側") } } ```