🥷

SwiftUIでButton.disabled(true)の時にもタップできるようにする

2023/02/02に公開

思いつきTipsです。動作確認してみたら動いて面白かったので記事にします。

環境

  • iOS 16
  • Xcode 14.1

Button.disabled(true)

SwiftUIのViewには disabled(_:) メソッドが用意されており、Buttonにも使用できます。Buttonに使用することでユーザーのアクションを受け付けないことと見た目も良い感じに無効状態にしてくれます。ただ、Buttonの見た目は無効状態だけど、タップされたらモーダルを出したいな。って場面に遭遇しました。この処理を実現する場合は状態に応じて無効状態の見た目の別のボタンを用意などが王道っぽさはありますが少し面倒にも思えます。今回はこの仕様の実現のために違ったアプローチをとってみます。

Button.disabled: https://developer.apple.com/documentation/swiftui/button/disabled(_:)#

結論

Button {
  // メインの処理
} label: {
  Label()
}
.disabled(disabled)
.onTapGesture {
  // 無効状態の時の処理
}

Button.disabled の後に onTapGesture をつけるでいけます。onTapGestureで違うViewになるからできるんだなと解釈しています。注意点はとしてはMenuの中のButtonを置いた時のような現状SwiftUIでは変更できない部分では適応されないので注意してください。

コード例は最小の構成になっています。onTapGestureの中で if disabledみたいな制御を入れなくても意図通り動きますが、入れた方が分かりやすい気もしているので入れても良いと思います。

まとめ

私は個人で開発しているアプリの有料プラン導線にしようしてみました。ちょっとした隠し機能とか入れるのも面白いかもしれないですね

おしまい \(^o^)/

Discussion