ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

スワイプでiPhoneのカーソルを動かせるようにするSwipeToMoveCursor

      2011/07/16

iPhoneでのテキスト編集時。

カーソルを移動する手段には、移動させたい辺りをタップするか、タップした上で押したままにし、虫眼鏡を表示させた上でドラッグするかの2種類あります。

虫眼鏡以外にもカーソルを動かせる手段はあった方がいいなということで、スワイプでカーソルを左右に動かせるようにするSwipeToMoveCursorというTweakを作ってみました。

すべてのケースでスワイプによるカーソル移動ができるとは限りません。
スワイプが便利だと思えないこともあるでしょう。(続きは[MORE]から)

SwipeToMoveCursorの機能

  • スワイプ系
    • 短い左右スワイプ: カーソルを1字単位で移動
    • 長い左右スワイプ: カーソルを行頭、行末に移動(1行入力タイプのテキストフィールドでのみ有効。ただし、論理行でなく物理行)

Type’n Goとは: Type’n Goとは、英語QWERTYキーボードで特定のキーシーケンスをタイプすることで機能を発動させるものです。

  • Type’n Go系
    • qqn: カーソル下
    • qqp: カーソル上
    • qql: カーソル右
    • qqh: カーソル左
    • qqf: 順方向単語単位ジャンプ(英単語)
    • qqb: 逆方向単語単位ジャンプ(英単語)
    • qqa: 行頭ジャンプ(物理行)
    • qqe: 行末ジャンプ(物理行)
    • Qqa: 文頭ジャンプ(Home)
    • Qqe: 文末ジャンプ(End)
    • qqi: タブ挿入
    • qq (スペース): 全角空白挿入
    • qqs: “ペア挿入、カーソルを間に移動
    • Qqs: “”ペア挿入、カーソルを間に移動
    • qq”: “”ペア挿入、カーソルを間に移動
    • Qq”: 【】ペア挿入、カーソルを間に移動
    • qq<: <>ペア挿入、カーソルを間に移動
    • Qq<: <>ペア挿入、カーソルを間に移動
    • qq’: ”ペア挿入、カーソルを間に移動
    • Qq’: 《》ペア挿入、カーソルを間に移動
    • qq(: ()ペア挿入、カーソルを間に移動
    • Qq(: ()ペア挿入、カーソルを間に移動
    • qq{: {}ペア挿入、カーソルを間に移動
    • Qq{: 『』ペア挿入、カーソルを間に移動
    • qq[: []ペア挿入、カーソルを間に移動
    • Qq[: 「」ペア挿入、カーソルを間に移動
    • qq\: \/ペア挿入、カーソルを間に移動
    • Qq\: \/ペア挿入、カーソルを間に移動
    • qqk: カーソル以降削除
    • qqv: ペースト

僕はテンキーと英語のQWERTYの二つのみキーボードを有効にしているので、キーボードの切り替えにそれほどストレスを感じませんが、それ以上の数キーボードを有効にしていると、Type’n Goの利用がストレスフルになり、便利さはスポイルされるでしょう。

想定質問:キーボードにカーソルキーを追加することはできませんか?

いろいろ試作しましたが、実用レベルに持っていくのが難しいので実現できていません。

想定質問:~でSwipeToMoveCursorが無効ですがバグですか?

SwipeToMoveCursorはUI部品個別に対応しています。
カーソルを移動させる統一的なAPIが無いためです。

カスタムUI部品ではSwipeToMoveCursorが有効にならないはずですが、カスタムUI部品は無数にあるため、個々に対応するのは現実的ではありません。
従って、SwipeToMoveCursorが無効なことがあっても、それはバグではありません。

ATOK PadはカスタムUI部品を使っていますが、これだけは特別に対応させました。

想定質問:なぜ上下スワイプにカーソル上下移動の機能を割り当てないんですか?

多くの場合上下スクロールとして応答するようになっている関係で、上下のスワイプは無効となります。

Safariでのアドレス編集時などでType’n Goが無効ですがバグですか?

一部のキーボードはType’n Goが使っているAPIを経由せずに文字入力をしているようで、そういうシーンではType’n Goは無効となります。

ATOK PadではType’n Goが動きませんがバグですか?

Type’n GoはOS標準のテキスト入力機能を利用しているため、ATOK Padには適用されません。

既知の不具合

  • 横にスクロールするような場面、例えばWebViewで大きなページを表示させているような場合ではスワイプによるカーソル移動は無効
  • 元々スワイプの操作がある場合はSwipeToMoveCursorが有効でなくなるか、元々の機能を上書きしてしまう排他的な結果になるはず
  • Safariのアドレス編集などでType’n Goが無効になる

動作確認環境

  • iOS 4.3.3
  • iOS 4.2.1

インストール


New野良リポジトリに置いておきました。

「SwipeToMoveCursor」で検索してください。

無保証です。

履歴

  • 0.5-1 2011.07.16 長いスワイプによる行頭、行末ジャンプの機能を削除。行頭、行末ジャンプではType’n Goのqqa, qqeを使ってください。これによって、入力の感覚が0.2相当に戻っています。ただし、1行入力タイプのテキストフィールドでのみ、長いスワイプによる行頭、行末ジャンプが使えます。また、Type’n Goのqql, qqhでカーソルの左右移動ができるようにもしました。
  • 0.4-1 2011.07.14 ATOK Padで動作がおかしかった問題を修正。その代わり、ATOK Pad上では長いスワイプによる行頭、行末ジャンプ機能を動かなくしました。修正のための必要な犠牲です
  • 0.3-1 2011.07.06 TextField上のクリアボタンが押せない問題に対処
  • 0.2-1 2011.07.05 長いスワイプ機能、Type’n Go機能追加、ハングル、半角カナでカーソルが移動しない問題に対処
  • 0.1-1 2011.03.18 初版

 - iPhone, Jailbreak