2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOS向けのWebアプリの作成時に気づいたこと

Last updated at Posted at 2024-05-02

概要

Webアプリはブラウザ上で閲覧できるため、PC/スマホ両方で利用することができます。
しかし、PCと異なりスマホは端末の画面が小さくなります。指でタッチすることを考慮する必要があるため、一部のスマホはUIに関する独自のガイドラインが定められています。
たとえば、iOS向けのユーザーインターフェイスのデザインのヒントのように、文字の大きさやタッチコントロールなど細かいところまでガイドラインが定められています。
今回は、上記のデザインのヒントを知らずに開発していたら、バグった話を紹介します。
Andoridの端末でもiOSのようなガイドラインが定められていますので、確認してみてください。

使っているバージョン(2024/04/24 執筆時点)

 iOS: 17.4
端末: iPhone15
 React: v18.2.0
 @mui/material: v5.14.4

隣接したチェックボックスのバグ

バグの詳細:

iOSの端末で、縦方向にチェックボックスグループを上から下の順で早くチェックした時に、なぜかチェック操作が正しく動作しないバグが報告されました。

サンプルコード:

たとえば、下記のような2つのチェックボックスのデモコードがあるとします。
デバッグのため、各チェックボックスがダブルクリックされた時はalert()で警告ダイアログを表示するように実装します。

function App() {
  return (
    <div>
      <div>
        <input type="checkbox" id="scales" name="label1" onDoubleClick={()=>alert("clicked 111")} />
        <label for="label1">label 1</label>
      </div>

      <div>
        <input type="checkbox" id="horns" name="label2" onDoubleClick={()=>alert("222 clicked")} />
        <label for="label2">label 2</label>
      </div>
    </div>
  );
}

export default App;

Screenshot 2024-04-25 at 15.00.20.png

動作確認:

label 1とlabel 2を比較的ゆっくりクリックすると、正常に動作します。
しかし、label 1とlabel 2を連続でクリックすると、"clicked 111"のlabel 1の警告ダイアログが表示されてしまいます。

ファイル名
解析:

こちらの現象は、iOS独自の処理で、クリックの間隔がとても短い場合、位置が少しずれていても同じ位置のダブルクリックとして見なす処理が入っているからです。
たとえば、iOS向けのユーザーインターフェイスのデザインのヒントでは、iOSのアプリをデザインする時は"指でのタップが正確に行えるよう、コントロール要素(ボタンなど)のサイズを(44x44ポイント以上)に設計しましょう"。となっています。

Screenshot 2024-04-25 at 16.27.19.png
参照先:https://developer.apple.com/jp/design/tips/

上記のデモコードのチェックボックスの高さは22ポイント(px)となっています。
各行の高さを45pxまで広げると、ダブルクリックのような現象は出なくなります。
ファイル名

function App() {
  return (
    <div>
      <div style={{height: "45px"}}>
        <input type="checkbox" id="scales" name="label1" onDoubleClick={()=>alert("clicked 111")} />
        <label for="label1">label 1</label>
      </div>

      <div style={{height: "45px"}}>
        <input type="checkbox" id="horns" name="label2" onDoubleClick={()=>alert("222 clicked")} />
        <label for="label2">label 2</label>
      </div>
    </div>
  );
}

export default App;

結論

iPhoneやモバイルデバイスでWebアプリを開発する際は、ボタン(チェックボックス)の配置などを気にしましょう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?