1

Apple の PhotoScroller サンプル コードからいくつかのコードを抽出して、CATiledLayer. インターネットからタイルで読み込まれた 8000x7000px の画像があります。

これは、私のアプリの一種のマップ機能です。また、オーバーレイが異なる2つのほぼ同一の画像があります(運が悪いとオーバーレイのみを追加しようとしました)。

UISegmentedControl3 つの選択肢を切り替える必要があり、imageView で選択した画像から画像を読み込む必要があります。そのため、ユーザーが画像の 1 つを拡大して別のオプションを選択すると、スケールと座標は同じままで、imageView は選択した画像を必要なタイル スポットに読み込みます。

私はこれを部分的に管理しました。[imageView removeFromSuperview];または、実際にこれを管理しましたが、別のオプションを選択すると、関数が呼び出されたときに画面全体が黒くなります。数秒で黒くなった後 (インターネットの速度によって異なります)、正しいタイルが表示されます。

可能であれば、レイヤーを次のレイヤーに「フェード」させたいです。ご存知かもしれませんが、 を使用するCATiledLayer場合、最初のレイヤーは低解像度の画像全体ですが、ズームインすると、必要なタイルが小さなタイルの次のレイヤーに「フェードイン」します。

私は基本的に「リロード」コマンドを与える必要があり(TilingView*)imageView、最後の画像を「フェード」させたいと思っています。

をコメントアウトしようとしましたが[imageView removeFromSuperview];、実際に私が望むものに近づきました。ズームインして別のオプションを選択すると、実際には新しい画像が古い画像の上にフェードアウトしましたが、ズームアウトすると、古い画像が明らかに背景 (新しい画像の後ろ) にくっついて何も反応しませんでした。後でそれを superView から削除する必要がありますが、新しい画像が imageView として置き換えられたため、アクセスできなくなりました。人々がここでコードを見たいと思うかもしれないことは知っていますが、どのコードを表示すればよいかまったくわかりません..そして、CATiledLayerドキュメントが非常に貧弱で、何が起こっているのかを理解するのに本当に苦労しています.

4

1 に答える 1

1

私はいくつかの大ざっぱなコードを使ってそれを機能させました。他にもっと良い解決策があるかもしれませんが、現時点で私が知っているのはこれだけです。

問題は、 を削除したときに[imageView removeFromSuperview];、最後のイメージがアンロードされなかったため、永久にメモリに残ることでした。ズームやスクロールの影響を受けなかったので、ズームアウトすると常に背景にありました。オプションを複数回切り替えると、背景に複数の画像が追加されます。

私は単に「helper」と呼んでいるものを作成しました。新しい画像がまだロードされていない場合、時期尚早に削除すると黒い画面が表示されるため、オプションを切り替えるときにimageView古いもののコンテンツを取得し、まだスーパービューから削除しません。imageView

[helper removeFromSuperview];ここで、デリゲート メソッドscrollViewWillBeginZoomingで AND を呼び出しますscrollViewWillBeginDragging。これにより、他のオプションをクリックしてからユーザーがスクロールまたはズームするまでの時間に、最大 2 つの画像を含むメモリが作成されます。

注: ユーザーが でオプションを切り替えた直後にスクロールまたはズームするUISegmentedControlと、新しいイメージがまだロードされていないため、黒くなります。

于 2012-08-26T06:38:24.587 に答える