# 同じ報告が 3 回目：SwiftUI のボタンが「文字の上でしか」反応しなかった。過去 2 回の「修正」は効いていなかった

> 「当選」「落選」ボタンが文字の上しか反応しない報告は 3 回目。過去 2 回は修飾子の順序を直しても効かず、ButtonStyle の中で見た目を組み立てて、6 か所を差し替えた。同じ日の「郵送なのに位置情報」も同じ根っこだった。

- URL: https://koshinstudio.com/notes/swiftui-hit-area/
- 公開: 2026-10-17
- 書いた人: Koshin（https://koshinstudio.com/about/）
- サイト: Koshin Studio

  English version (https://koshinstudio.com/en/notes/swiftui-hit-area/)

トレカダッシュ 開発の記録 ／ 2026年8月

  iOS アプリ「トレカダッシュ (https://koshinstudio.com/works/torecadash/)」の応募の記録の画面には、「当選」と「落選」のボタンがあります。「当選と落選の文字の上しか判定が無くて、使いづらい」という報告が来ました。

  この報告は、3 回目でした（7 月 20 日、8 月 1 日、そして 8 月 27 日）。過去 2 回も、直したつもりでした。コードには、「修正」と書いてありました。それなのに、一度も、直っていませんでした。

  この記事は、2026 年 8 月 27 日の作業の記録から書いています。

## 過去 2 回の直し方は、効いていなかった

  過去 2 回は、「.contentShape を足す」、「.buttonStyle(.plain) の位置を変える」という直し方をしていました。どちらも、修飾子の順序が問題の本質で、その順序を、正しく直せていませんでした。

  SwiftUI の Button("当選") { … } は、ラベルが文字だけです。その外側に、.frame().padding().background() を足して、見た目の大きさを広げても、タップに反応するのは、文字の部分だけです。見た目と、反応する範囲は、別のものでした。

## 直し方：ButtonStyle の中で、見た目を組み立てる

  ボタンの見た目を、ButtonStyle（ボタンの装飾を決める仕組み）の中で組み立てると、その結果が、そのまま、タップの領域になります。外側に足すのではなく、中で作ります。専用の ActionButtonStyle を新設して、6 か所を差し替えました（当選、落選、応募した、発表日を入力、絞り込みの「適用」が 2 か所）。

## 同じ日の、似た 2 件

  同じ日に来た、ほかの報告にも、同じ根っこがありました。

- 「締切のカレンダーで、ステータスを切り替えたい」。前に出したバッジを、タップで「応募済み」と「応募前」に切り替えられるようにしました。ところが、行そのものがボタンだったので、中にボタンを置いても反応しません。行を、タップの判定（contentShape ＋ onTapGesture）に変えました。また、当選と落選は「記録」なので、切り替えません。誤ってタップして消えると、取り返しがつかないからです。

- 「郵送なのに、位置情報がついている」。楽天ブックス（通販専門）の記事に、静岡県の座標が入っていました。通販かどうかを、サイトの接頭辞でしか見ていなかったので、まとめ経由の記事（接頭辞が別）がすり抜けていました。店名でも判定するようにしました。さらに、配送に直しても、座標と都道府県を消していなかったことも、原因でした。都道府県が残ると、エリアの絞り込みで、ほかの県の利用者に、記事が表示されなくなります（郵送なのに、静岡の人にしか出ない）。

## 分かったこと

> 「直した」と書く前に、同じ形が他にも無いか、探す。

- 同じ報告が 2 回来たら、直し方を疑う。コードに「修正」と書いてあっても、効いているとは限りません。

- 見た目の大きさと、反応する範囲は、別のもの。ButtonStyle の中で組み立てると、一致します。

- 同じ形を、すべての画面で探す。grep で、同じ書き方を全部見つけて、直します。

- 取り返しのつかない記録は、誤タップで消えないようにする。切り替えは、応募済みだけ。

- 値を直したら、関連する値も直す。配送に直したら、座標と都道府県も消します。

  この話に出てくるもの

- トレカダッシュ (https://koshinstudio.com/works/torecadash/) — トレカの抽選・予約・先着の情報を集める iPhone アプリ

- iOS アプリが固まって強制終了される (https://koshinstudio.com/notes/torecadash-watchdog/) — アプリの別の不具合

- 失敗を捨てると、画面は嘘をつく (https://koshinstudio.com/notes/swallowed-failure/) — アプリの別の失敗

- 関門を直しても、すでにあるデータは直らない (https://koshinstudio.com/notes/fix-the-existing-data/) — 直したのに直っていない話
