問題タブ [catiledlayer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
html - Sencha Touch/ExtJS: タイルスクロールビュー (CATiledLayer など)
私はCATiledLayer
(iOS上で)のようなものを探していますが、PhoneGap/Sencha Touch 2で使用するためのものです.
アイデアは、サーバーから非常に大きな画像をタイルの形で「ストリーミング」することです。これは、Google マップがその仕事をするのと非常によく似ています。
ユーザーがズームやスクロールをピンチできるように、モバイル デバイスでのタッチ ジェスチャをサポートする必要があります。
残念ながら、私は何かを見つけることができなかったので、いくつかの指針を高く評価しています.
アップデート:
その間、私はOpenLayersを調べました。これは、私が望むようで、ズームなどの複数のレイヤーを管理します。残念ながら、これは Geospartial データに依存しすぎており、投影を無効にして基本的な画像ビューアーのように機能させる方法はありません。
GSV (Big Ass Image Viewer)も見つけました。残念ながら、私はタッチ ジェスチャをサポートしておらず、一般的に放棄されているようです。
私にとって、誰もこのようなものを本当に必要としていないというのは奇妙なことであり、私はできる限り「車輪の再発明」を避けようとしています. しかし、現時点では、地理データ/地図に関連しないソリューションはないようです。
ios - drawRectで定義されたサブビューを持つCATiledLayer対応のUIViewが、異常なメモリ使用量のためにクラッシュします
iPad 3でメモリ不足のクラッシュが発生しました。これは、次のシナリオで追跡したものです。
CATiledLayerを使用してコンテンツ(PDFなど)を描画するUIViewには、独自のdrawRectメソッド(検索結果を強調表示するなど)を持つサブビューがあります。これにより、Core Animationは大量のメモリ(VMTracker機器では100MB以上)を消費し、簡単にクラッシュする可能性があります。この問題はすべてのデバイスに存在しますが、iPadのRetinaディスプレイでのみ、キャッシュサイズが大きくなりすぎます。
これは、AppleのPhotoScrollerの例で再現できます。UIViewをサブクラス化し、drawRectのコメントを解除し、TilingViewにインスタンスを追加します。アプリはiPad3でクラッシュします。drawRectにコメントすると、メモリ使用量が解決されます。
これで、サブビューを削除して、一番上のUIViewで描画を行うことができます。ただし、サブビューの操作は便利です(PDFの上に異なる独立したレイヤーを表すため)。2つの質問:
- 良い回避策は何ですか?できれば、複数のビューで作業を継続できるものが望ましいです。
- なぜこれが起こっているのですか?キャッシュメカニズムは時間外に機能していると思いますが、その背後にある技術的な詳細を理解することは素晴らしいことです。
ありがとう!
編集:
甲斐さんの答えを詳しく説明したいと思います。この問題は実際にはCATiledLayerとは関係ありませんでしたが、drawRectを実装したUIViewの使用法とは関係ありませんでした。
PhotoScrollerの場合、画像のサイズ(2000x2000以上)のUIViewを作成しました。これにより、drawRectが存在する場合に巨大なバッキングストアが作成されます。
私たちのアプリの場合、オーバーレイビューはフルスクリーン(iPad3では約11MB)であり、ページごとに約5つあります。スクロール中は最大3ページのメモリを保持します。つまり、150MBを超えるメモリが追加されます。楽しくない。
したがって、解決策は、drawRectを最適化するか、そのようなビューの使用を減らすことです。製図板に戻ると:-)
objective-c - iPad第3世代でズームイン中にCATiledLayerが削除および更新されます
親UIScrollViewをズームインすると、CATiledLayerで再描画の問題が発生します。
CATiledLayerでバックアップされたUIViewでPDFページをレンダリングしています。その背後には別のUIImageViewがあり、CATiledLayerが描画するページの低解像度の画像が含まれています。ズームインすると、期待どおりに機能します。CATiledLayerは、ズームレベルに応じてより高解像度の画像をレンダリングします。
ズーム後に問題が発生します。ズームインしてiPadをそのままにしておくと、表示された画像がぼやけてから鮮明になります。バッキングビューにぼやけた低解像度の画像が表示されるため、CATiledLayerが削除されているように見えます。その後、CATiledLayerが再描画されます。つまり、タイリング効果と画像の再シャープネスが表示されます。これは、アプリをそのままにして30〜40秒待つと発生します。私はそれをiPadの第3世代(新しいiPad、iPad3など)でしか観察していません。iPad2でもテストしていますが、まだ問題は発生していません。
他の誰かがこの問題に遭遇しましたか?既知の原因と、場合によっては解決策はありますか?
編集:
私のUIScrollViewDelegateメソッドは次のとおりです。
問題が発生している間、scrollviewは入力を受け取らないため、これがどれほど役立つかはわかりません。上記のように、PDFページがCATiledLayerにロードされ、iPadをそのままにして(デバイスが入力を受信しない)、CATiledLayerが自動的に再描画します。
setNeedsDisplay
また、ビューとタイルレイヤーの両方でsetNeedsDisplayInRect:
、、、の呼び出しをキャッチしようとsetNeedsLayout
しましsetNeedsDisplayOnBoundsChange:
たが、これらの関数が呼び出されることなく再描画が行われます。drawLayer:inContext:
もちろん、が呼び出されますが、トレースには、バックグラウンドスレッドで開始された一部のQuartz呼び出しのみが示されているため(タイルレイヤーがバックグラウンドでコンテンツを準備するため、予想どおり)、それも役に立ちません。
前もって感謝します!
xcode - xcode: catiledlayer でのオブジェクトの描画
自分のオブジェクトを CATiledLayer に描画しようとしていますが、drawLayer で使用されるコンテキストにオブジェクトをプッシュする方法がわかりません。たとえば、drawLayerメソッド内でテキストコードを宣言することで、画面に描画したいテキストを追加できることはわかっていますが、ユーザー入力を取得したときにのみ何かを描画したい場合は、これを作成したいと思います新しいテキストオブジェクトを作成して画面に描画しますが、コンテキストが必要なため、drawLayer メソッドの外でこれを行う方法がわかりません。
ios - MonoTouch で素晴らしい PhotoScrollerNetwork を移植する方法は?
PhotoScrollerNetwork アプリを MonoTouch (iOS 5 Apple PhotoScroller の例の大幅に改善されたバージョン) に移植しようとしていますが、MonoTouch では再現できないことをコードが実行しています。
https://github.com/dhoerl/PhotoScrollerNetwork
たとえば、MonoTouch でメモリ管理を再現するのは非常に難しく、それがないとクラッシュします。著者 (dhoerl) は readme に次のように書いています。
v2.0: - iPad1 と iPhone3GS (メモリが 256M しかない) が、OS の警告なしで終了していました。そのため、cdisk キャッシュの使用量に上限を設定し、しきい値に達したときに (メモリを解放するために) ファイルをフラッシュします。クラッシュはなくなりました。
次のクラスを MonoTouch に移植するのは非常に複雑です。
彼の GC のおかげで、MonoTouch で上記のメモリ管理のトリックを処理する別の簡単な方法があるかもしれません。PhotoScrollerNetwork アプリを移植して共有したいと思った人はいますか?
どんな提案でも大歓迎です、ありがとう。
objective-c - CATiledLayer の基本: PDF のレンダリング時に CATiledLayer の drawLayer:inContext: が頻繁に呼び出されるのはなぜですか?
CATiledLayer
を使用して PDF ページをレンダリングするときの仕組みを理解しようとしていますCGContextDrawPDFPage()
。
私の理解では、drawLayer:inContext:
タイルと詳細レベルごとに 1 回呼び出されます。あれは正しいですか?
タイル化されたレイヤーのデリゲートで呼び出しますが、タイル化されたレイヤーのタイルサイズを小さくすると、より頻繁に呼び出されるCGContextDrawPDFPage().
ことに気付きました ( にログを入れることによってdrawLayer:inContext:
) 。drawLayer:inContext:
これは私が不思議に思う:
- 私のPDFページはx回描画/レンダリングされていますか?
- それとも、CGContextDrawPDFPage() はページのどの部分を描画するかを魔法のように知っているのでしょうか?
- PDF ページをレンダリングするとき、CATiledLayer はリソースの無駄ではありませんか? その利点は何ですか?
objective-c - UIScrollViewとCATiledLayerを使用してズーム可能なUIViewにマーカーを描画する方法
UIScrollViewとCATiledLayerを使用しているズーム可能なUIViewにマーカーを描画したいと思います。私は現在、AppleのPhotoScrollerデモアプリと同じセットアップを使用しています。図形を描くのに問題はありませんが、ズームした後も同じ場所にとどまってほしいです。そのために変換行列を使用できますか?または、ズーム後またはズーム中に図形を再描画する必要がありますか?それは費用のかかる操作のようです。
描いている形を拡大縮小したくありません。したがって、スケーリング変換を使用することはできません。
MapViewがこの機能をどのように実装しているか興味があります。誰かアイデアはありますか?
iphone - CATiledLayerからCALayer
CATiledLayerバッキングのあるビューがあります。このCATiledLayerUIViewから表示されているタイルを取得し、それをCALayerバッキングとして別のビューに追加して、CATiledLayerを使用しない別のUIViewで表示されている画像を再作成したいと思います。
これを実行したい理由は、この2番目のUIViewを使用して、CATiledLayerでサポートされたUIViewの更新の影響をマスクするためです。これにより、現在、すべてのタイルが再ロードされるときにちらつきが発生します。
問題は、私がこれをどのように行うのか完全にはわからないということです。何か案は?
iphone - CATiledLayerの問題
PhotoScrollerアプリのようにCATiledLayerを使いたい。私のTilingView.mには
ですから、Retinaディスプレイを使用すると、常に
シミュレーター(網膜ディスプレイ)では完璧に動作しますが、デバイスでは(画像!= nil、チェック済み)の後に例外がスローされます
例外
前もって感謝します。
iphone - CATiledLayer の背景画像
ご存じかもしれませんが、CATiledLayer
は、ビュー サイズに適した縮尺でタイル イメージを表示することにより、大きなイメージを表示するために使用されます。
私はCATiledLayer
iOSのドキュメントの下にある例と同様の作業をしており、どの行と列のdrawRect:(CGRect)
四角形がそのコンテンツを描画しようとしているかを計算します。
ビューが初めて表示されると、そのビュー/レイヤーの背後に何もない空のビューでタイルごとに描画が開始されます。最初に低解像度の画像を配置してレイヤーを埋め、次にタイル ビューの描画を開始しようとしています。
PDF ページを移動しているときと同じように、各ページは最初は非常に貧弱な画像で表示されますが、コンテンツのレイアウトを確認するには十分であり、特定のページで停止すると、このページがより明確になります。
catiledlayer の上にサブレイヤーを追加できることはわかっていますが、これは masterlayer であるため、catiledlayer の背後にレイヤーを配置することはできません。また、同じレイヤーに背景用の画像をロードして、適切にスケーリングできるようにすることも重要だと思います。
これを達成する方法を知っている人はいますか?