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

English version

トレカダッシュ 開発の記録 / 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 件

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

分かったこと

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

この話に出てくるもの

ほかの記録

コメント

感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。

押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。