6

次のメソッドでコンテンツをレンダリングするCATiledLayerがあります

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx

QuartzDemoコードを使用してパターンを描画しました。これは、レイヤーのparentLayer(UIView)に回転変換を適用するまでは非常にうまく機能します。

回転していないCATiledLayer

回転:

回転したCATiledLayer

これらのジグザグアーティファクトは、CATiledLayerに線やテキストを描き始めると悪化します。

次のように変換を適用しました(ビュー自体にアフィン変換を使用してみました)。

self.containerView.layer.transform = CATransform3DMakeRotation(angleRadians, 0.0f, 0.0f, 1.0f);

相対位置を変更せずに同時に回転させたいビューに複数のレイヤーがあるため、レイヤー自体ではなく、containerViewを変換します。

過去にUIImageViewsを回転させても問題はありませんでした。

これらの問題なしにCATiledLayerを回転させる方法はありますか?

どんな助けでも大歓迎です。

あなたの、

フェリックス

4

3 に答える 3

3

私が見つけたこの問題を修正する唯一の方法はこれでした:

  1. レイヤーをビットマップ コンテキストに描画します
  2. そのコンテキストの CGImageRef をレイヤー コンテンツとして設定します。
于 2010-04-16T09:24:10.397 に答える
2

OpenGL でのアンチエイリアシングは多くの場合、コストがかかるため、処理リソースが限られているため、iOS の Core Animation では無効になっています。ここでのキーワードは速度です。Core Animation は描画速度に合わせて最適化されており、これがアニメーションの滑らかさにつながります。画質が優先される場合は、Core Animation を回転変換と共に使用しないでください。

Core Animation の一部のタスクでは、レイヤー コンテンツの周囲に 1 ピクセルの境界線を追加できます。アンチエイリアシングを使用しない場合、エッジはギザギザになりますが、コンテンツがエッジ上にない場合、コンテンツはこの影響を受けず、代わりにテクスチャ フィルタリングにより滑らかになります。

于 2011-01-17T12:39:17.760 に答える
1

Ryan Zachry が既に指摘しているように、ここではアンチエイリアスが役立ちます。ここで経験している効果は「階段」効果です。

ピクセルは正方形なので、アーティファクトを生成せずに直線 (水平または垂直) を簡単に描画できます。斜めに線を描いている場合は、線をラスタライズする必要があります。ライン描画のアルゴリズムは、ラインをピクセルにマッピングしようとするときに近似値を作成する必要があります。そのようなアルゴリズムの例はBresenham のものです(非常に人気があり、実装が簡単ですが、アンチエイリアシング機能はありません)。これが何をするかです:

ウィキペディアより

この写真で非常にはっきりとわかるように、任意の角度で線を引くと、いわゆる階段効果が生じます。この影響を避けるには、アンチエイリアスを使用できます。アンチエイリアシングは、実際には信号理論の一部です。これは、高解像度信号を低解像度で表現する際にエイリアシングとして知られる歪みアーティファクトを最小限に抑える技術です。上記の行の例からわかるように、これはコンピュータ グラフィックスに非常によく当てはまります。

アンチエイリアシングは非常に複雑ですが、アイデアは、ピクセルごとに線を近似するだけでなく、インテリジェントな色付けを使用して、ピクセル単位ではない特定の位置に線を表示することによって画像を強化することです.

ウィキペディアより

Core Graphics で組み込みのアンチエイリアシングを有効にするには、回転を実行する前に次の操作を行います。

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);

アンチエイリアシングは、処理能力の点で非常に高価になる可能性があることに注意してください。必要な場合にのみ使用してください。

于 2010-04-14T11:07:13.420 に答える