私はiOS 7用に自分のアプリを書き直しました。新しいTextKit APIを使用しています。私はほぼ完了していますが、移行を開始して以来私が頭痛を引き起こしているもう一つの問題があります。UITextViewがテキストの削除/挿入後にスクロールアップ
問題: UITextViewにテキストを入力すると、時々表示がスクロールしてカーソルが隠れてしまいます。パターンをピンポイントするのは難しいですが、行を削除した後に表示され、下のテキストが上に移動する必要があります。
:しかし、唯一の二度目は私がとONLY(のみ改行文字を持っていますが、常にではない...一般回線)
私はstackoverflowの上でこれらのソリューションを使用してみましたが、文書内の特定の行と行を削除しますHow to stop UITextView from scrolling up when entering it
UITextView keep scrolling after every new line is inserted, so the lines are invisible (iPhone OS)
Scroll to bottom of UITextView erratic in iOS 7
のUITableViewワットを持ったときにスクロールが正しく動作しません。他の多くの問題もあります。 UITextView内にあります。私は私の見解ではテーブルビューを持っていません。
私はUITextViewをサブクラス化し、それが間違いなくiOS 7でビューを上にスクロールするだけでなく呼び出しを行うことを発見したことを指摘したいと思います。また、見知らぬ人は、(UITextViewから文字を削除するために)戻るボタンを押すと、textViewDidChangeSelection:
に2つのメッセージを送信するということです。問題が発生したときのコールスタックを次に示します。 (問題が発生していないとき、私はまだ正常であると思われる... 2つのコールがtextViewDidChangeSelection:
を委任してもらう):
- UITextViewデリゲート
textViewDidChangeSelection:
は、1の長さで、削除する文字の位置が含まれています。 (すなわち1050,1) - UITextViewデリゲート
textViewDidChangeSelection:
が再度呼び出され、同じ位置に長さゼロが含まれます。 (すなわち、1050,0) - scrollViewDidScroll(最大3倍である。一般的に、一度だけ)
- その後のiOS 7は、{1050,1}の最初の呼び出しの範囲のw/
UITextView.scrollRangeToVisible:
を呼び出します。これは私には意味がありません。この内部APIはスクロールイベントを呼び出すために使用した可能性のある関数へのトレースバックなしで_ensureselectionvisible
と呼ばれているため、これは内部的に呼び出されたものであり、私のコードからではありません。
おそらく、最初の2回の呼び出しは文字を選択するだけで、内部的にはdeleteBackwardsを呼び出します。それは理にかなっている。私はそれの後で盲目を飛んでいる。私はそれがスクロールする理由、またはWRONGの範囲を持つscrollRangeToVisible:
をなぜ呼び出すのか分かりません。
ユーザーがテキストを編集しているときに[super scrollRangeToVisible]
を呼び出すことなく、UITextView.scrollRangeToVisible:
を乗り越えて問題を緩和することができました。私は、スクロールビューの代理コールの一部をオーバーライドし、スクロールが発生しないことを示すフラグを設定することでこれを行います。これは私にとって、巨大なUGLYハックであり、最初の編集時にビューをタップしたり、スクロールビューが減速を停止したりするなどの特定の状況でも問題が発生します。
要するに、スクロールするイベントが発生している可能性があります(おそらく、前の行が上がっているためです)、何らかの理由でiOSがカーソルが表示されていないと考えています。さらに興味深いのは、間違った範囲が指定されていても、正しい位置を提供し、ビュー内の間違った位置にスクロールするということです。さらに興味深いのは、特定の条件でのみ発生し、条件が発生する2番目のインスタンスでのみ発生するということです。私が考えることができる唯一のことは、テキストが削除された後にUITextViewの高さが正しく計算されず、テキストが実際とは異なる場所にあると考えていることです。
ありがとうございます!
UPDATE:
私はscrollViewDidScroll:
で先の話を聞いたフラグを設定し、それはいくつかの他のインスタンスにジャンプを防ぐことはできません。しかし、テキストを逆方向に削除すると、まだ画面がジャンプする例があります。ビューがまだジャンプしているインスタンスでさらに奇妙なのは、[super scrollRangeToVisible]
が呼び出されないようにしていることです。内部で何か起こっていることがADDITIONで表示され、ビューがスクロールします。
UPDATE:
上向き613ptsと670pts間をジャンプするように見えます。私は何がポイントの違いを引き起こすのか分からない。ジャンプする行の数も変わります。私は、何かが条件の間で似ていると思われるでしょう。また、scrollViewDidScroll:
が呼び出されると、この呼び出しとデリゲートtextViewDidChangeSelection:
コールの間でtextView.selectedRange.location
が同じであることが確認されました。
残念ながら、それは私の問題を解決しません。しかし、応答に感謝! – PeqNP
私は間違っていた!それは私の問題を解決しました。私はまだ特定の条件でスクロールが発生しないようにするロジックを持っていました。どうもありがとうございます! – PeqNP
も私の問題を解決しました – TonyTony