13

全て、

CATiledLayer から必要な動作を取得できません。最初にタイルの領域が白くクリアされるという副作用なしに、タイルを再描画するようにトリガーできる方法はありますか? すでに CATiledLayer をサブクラス化して、fadeDuration が 0 を返すように設定しました。

具体的には、私が見ていることと達成しようとしていることの詳細を以下に示します。

  • 大きなコンテンツサイズの UIScrollView があります...〜12000x800。そのコンテンツ ビューは、CATiledLayer に基づく UIView です。
  • UIView は、多くのカスタム描画された線でレンダリングされます
  • すべて正常に動作しますが、UIView の内容が変わることがあります。そんな時はなるべくシームレスにタイルを描き直したい。ビューで setNeedsDisplay を使用すると、タイルが再描画されますが、最初に白にクリアされ、新しいコンテンツが描画されるまでに数分の一の遅延があります。すでに CATiledLayer をサブクラス化して、fadeDuration が 0 に設定されるようにしました。
  • 私が望む動作は可能であるように思われます...スクロールビューを拡大し、コンテンツがより高い解像度で再描画されると、再描画の前に空白はありません。新しいコンテンツは古いコンテンツの上に描画されます。それが私が探しているものです。

ありがとう; あなたのアイデアに感謝します。

更新

フォローアップするために-再描画の前にタイルが白くクリアされていないことに気付きました.タイルは完全に取り除かれています。私が見ていた白は、CATiledLayer に裏打ちされたビューの下にあるビューの色です。

簡単なハック/修正として、UIScrollView の下に UIImageView を配置し、CATiledLayer に基づくビューの再描画をトリガーする前に、その可視セクションを UIImageView にレンダリングして表示させます。これにより、再描画が大幅にスムーズになります。

そもそも再描画される前に再描画対象のタイルが消えないようにするなど、誰かがより良い解決策を持っている場合は、それを聞いてみたい.

4

5 に答える 5

4

levelOfDetailBias と levelsOfDetail の両方を同じ値 (私の場合は 2) に設定すると、setNeedsDisplayInRect: 呼び出しによって触れられたタイルのみが再描画されることがわかりました。

ただし、levelsOfDetail が LODB と異なる場合は、setNeedsDisplayInRect: を呼び出すと、すべてのタイルが再描画されます。

于 2013-03-28T00:45:45.330 に答える
1

既存のタイルレイヤーの後ろに別のレイヤー(おそらくCATiledLayer)を追加できます。(ダブルバッファーソリューションのソート。)setNeedsDisplay:数秒後に起動するタイマーから2番目のレイヤーを呼び出して、そのレイヤーがフロントレイヤーと同時に再描画されないようにします。

于 2010-01-16T16:34:17.417 に答える
1

もう 1 つの考えられるオプションは、同じデリゲートを使用してコンテンツをビットマップ コンテキストに描画し、コンテンツが更新されたらビットマップをバッキング ストアにスワップすることです。これにより、ちらつきのない結果が得られるはずです。そうは言っても、これがどのように行われるかはわかりません。CATiledLayers の優れた点の 1 つは、ズームするとタイルが自動的に生成され、ズームインするとパンするとタイルが事前生成されることです。

アプリケーションをどのように実装するかを確認したいと思います。UIScrollView と CAtiledLayer-back ビューを組み合わせて使用​​し、多くのカスタム描画線を使用する例を見つけるために、何週間も探していました。Apple には優れたサンプル コードがいくつかありますが、すべて線画ではなく画像が含まれているため、私には何の助けにもなりません。

于 2010-05-19T00:23:50.897 に答える
0

iPadでも同じ問題がありました。

解決策は私が思っていたよりも単純で、再描画する前にUIImageViewを使用して表示をレンダリングするよりもはるかに単純でした...:

レイヤーの背景色を設定しないでください。

同様の方法でCATiledLayerを設定しました。

layer = [[CATiledLayer alloc] init];
layer.masksToBounds = YES;
layer.contentsGravity = kCAGravityLeft;

//layer.backgroundColor = [[UIColor whiteColor] CGColor];

layer.tileSize = CGSizeMake(1004.0, 1004.0);
layer.levelsOfDetail = 16;
layer.levelsOfDetailBias = 8;

ライン設定レイヤーの背景色を白にコメントアウトしていることに注意してください。その後、再描画前の白い空白の問題はなくなりました!

誰かがそれを試したことがあるかどうか私に知らせてください。

于 2010-07-01T15:45:30.483 に答える
0

これらの回答を解決策なしで読んだ後、ページのタイリングが支配的なバックグラウンド タスクであることがわかりました。
優先度の高いキューで低解像度のプレースホルダー イメージを準備すると、この問題が解決されました。タイリングの実行中にイメージが表示されるようになりました。プレースホルダー イメージをキャッシュすると、それらの外観がさらに改善されます。タイリングが開始される前に表示されます。
新しいデバイスでは、タイリングが非常に高速であるため、これらのトリックは問題にならない場合があります。私の経験では、スキャンされた大きな画像 (スキャンされた本など) で構成されるサンプル PDF は、タイル化が最も遅く、適切なテスト データになります。

于 2016-02-20T17:11:23.833 に答える