同じ報告が 3 回目:SwiftUI のボタンが「文字の上でしか」反応しなかった。過去 2 回の「修正」は効いていなかった
トレカダッシュ 開発の記録 / 2026年8月
iOS アプリ「トレカダッシュ」の応募の記録の画面には、「当選」と「落選」のボタンがあります。「当選と落選の文字の上しか判定が無くて、使いづらい」という報告が来ました。
この報告は、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で、同じ書き方を全部見つけて、直します。 - 取り返しのつかない記録は、誤タップで消えないようにする。切り替えは、応募済みだけ。
- 値を直したら、関連する値も直す。配送に直したら、座標と都道府県も消します。
この話に出てくるもの
- トレカダッシュ — トレカの抽選・予約・先着の情報を集める iPhone アプリ
- iOS アプリが固まって強制終了される — アプリの別の不具合
- 失敗を捨てると、画面は嘘をつく — アプリの別の失敗
- 関門を直しても、すでにあるデータは直らない — 直したのに直っていない話
ほかの記録
- 「ヤマダ電機」と「ヤマダデンキ」:表記ゆれと重複の原因は 3 つ重なっていた(包含だけの比較・59 秒の差・手動専用のジョブ) — 店名を「含んでいるか」だけで比べ、締切を 59 秒の差で別と判定し、重複整理が手動専用だった。言い換えの表は作らず一般則で直し、1 時間おきの定期実行にした。表記ゆれ 2 件、重複 7 組が 0 に。
- あいまいな店名で地図を引くと、日本の真ん中の静岡が返る:チェーン名を並べず、Google 自身の答えで判定した — 店名を Google の地図検索に渡すと、あいまいな名前では日本全体の矩形の真ん中(静岡・愛知)が返った。ヤマダデンキが浜松、サンエーが掛川の工場に。チェーン名の一覧は作らず、答え自身で信用できるかを 4 つの規則で判定した。
- 「1 ページ = 1 案件」ではなかった:1 つのフォームで 6 商品を受け付ける店の記事が、リンクが同じというだけで消されていた — リンクだけで重複と決めるジョブが、1 つの Google フォームで 6 商品を受け付ける店の記事 5 件を消していた。「リンク + 商品」に直した。サーバが作った「応募枠」をアプリが一度も読んでいなかったことも見つかった。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。