4

私は約7000x6000pxの画像を持っています。これをアプリのscrollview/imageViewに含める必要がありますが、これは表示用に巨大な方法です。一種の地図になっているはずです。アプリのサイズを最小限に抑えたいと思っていましたが、画像は.jpgで約13MBです。.pngでは100MBを超えていますが、これは許容できません。多くの人がCATiledLayerオプションとして提案していますが、これによりファイルサイズがさらに大きくなると思います。とにかく、私はそれを使って、TileCutterで独自のタイル(.jpgのタイル)を作成しようとしましたがCATiledLayer、サイズはそれほど悪くありませんでした。しかし、私はいたるところにエラーがあります。iOS版のCATiledLayer私には謎であり、これを解決する方法を見つけることができません。配列にはその特定のインデックスにコンテンツが含まれていますが、Javaと同等の「配列の範囲外のインデックス」について何かを言うエラーが発生します。配列を返すメソッドがあります。配列には.plistのデータが含まれています。戻る前に、アレイのコンテンツをログアウトして、適切なデータを取得します。呼び出しはアクセスしようとしています

[array objectAtIndex:0]

そしてそれを辞書に入れますが、OutOfBoundsをスローします。アレイ全体をログアウトすると、内容がはっきりとわかりますが、ログアウトすると

NSLog("%@",[method objectAtIndex]); I get the same exception.

とにかく、私にCATiledLayerは問題しかありませんでした。私はPhotoScrollerプロジェクトをリバースエンジニアリングしてきましたが、運がありませんでした。誰か他の解決策がありますか?

ありがとう。

4

2 に答える 2

14

Appleには、CATiledLayerを使用し、複数の画像をスクロールしてズームできる、この非常に優れたプロジェクトPhotoScrollerがあります。Appleが画像を「だまして」事前に並べて表示したことがわかるまで、これは本当にすてきなようでした(バンドルにファイルとして保存された約800個のタイル!)

同様の機能が必要でしたが、ネットワークから画像をダウンロードする必要がありました。このようにして、PhotoScrollerNetworkが生まれました。TiledImageBuilderを使用すると、大量の画像をダウンロード(またはディスクから読み取る)できます(18000x18000の画像もテストしました)。これで動作します。

このクラスが行うことは、ダウンロード時にイメージのタイリングを開始するか(libjpegturboを使用している場合)、ファイルを保存してからタイリングできます(時間がかかります)。クラスは、画像をフル解像度で表示し、含まれているビュー(スクロールビュー)に収まるサイズにするために必要な詳細レベルの数を把握します。

クラスはディスクキャッシュを使用してタイルを保持しますが、ファイルを作成して開き、リンクを解除してタイルが実際に保存されないようにするという古いUnixのトリックを使用します。クラスの割り当てが解除されると(ファイル記述子が閉じられると)、タイルは解放されます(または、アプリがクラッシュした場合、タイルも解放されます。

メモリが非常に限られているiPad1で問題が発生したため、クラスは複数の画像を同時にロードするときにファイルシステムの使用を制限するようになりました。今年はWWDCでiOSカーネルマネージャーと話し合い、スロットル手法を説明した後、アルゴリズム(ディスクキャッシュ使用量の管理)がおそらく使用できる最良の手法であると述べました。

于 2012-08-23T11:39:11.830 に答える
5

CATiledLayerを提案した人は正しいと思います。あなたは本当にそれを使うべきです!そのテクノロジーを使用して巨大なビットマップを表示するサンプルプロジェクトが必要な場合は、こちらをご覧ください:http: //www.cimgf.com/2011/03/01/subduing-catiledlayer/

私たちがCocoa/Cocoa Touch開発者として使用している多くのテクノロジーは、私たちが単にそれらを理解しておらず、それらを採用することは困難な作業に思えるかもしれないため、心の弱い人に触れられません。それらのテクノロジーの1つは、Core Animationにあり、CATiledLayerと呼ばれます。その実装の多くが少しブラックボックスであり、この事実が誤解されている原因となっているため、これは魔法のようなテクノロジーのように見えます。CATiledLayerは、メモリに深刻な影響を与えることなく、非常に大きな画像を描画する方法を提供します。これは、展開する場所に関係なく重要ですが、メモリは貴重であり、OSがメモリを解放するように指示した場合は、解放できるようにするか、アプリがダウンするため、iOSデバイスでは特に重要です。

于 2012-08-23T11:07:01.207 に答える