4

UIBezierPath があり、次のことを希望します。

  • UIView 上の任意の座標に移動
  • 大きくしたり小さくしたり

事前定義された座標のリストに基づいて UIBezierPath を描画しています。このコードを実装しました:

CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f);
[shape applyTransform:moveAndScale];

また、スケーリングしてから形状を移動しようとしましたが、ほとんどまたはまったく違いがないようです。

このコードの使用:

[shape moveToPoint:CGPointMake(0, 0)];  

(0,0)から描き始めたのですが、こうなってしまいます。これは、0, 0 からリストの次のポイントまで線が引かれているためだと思います。

ここに画像の説明を入力

移動変換を (0, 0) に設定すると、ここに描画されます。ここで、moveToPoint はリストの最初の座標ペアに設定されます。ご覧のとおり、0, 0 ではありません。

ここに画像の説明を入力

最後に、 1.0f を大きくすると、形状をどこに移動するように指示しても、形状が画面から完全に外れます。

図形が 0, 0 で描画されない理由と、拡大縮小すると画面から移動する理由を誰かが理解するのを手伝ってくれますか?

4

2 に答える 2

2

(上記のコメントでOPから要求されたとおり)

私はこれについて間違っているかもしれませんが、このコードはそうではありません

CGAffineTransformMakeTranslation(0, 0);

何かを x 軸に沿って 0 ピクセル、y 軸に沿って 0 ピクセル移動する必要があるとだけ言ってください。(参照) origo(0, 0) には実際には何も移動しません。実行しようとしているようです。

また、 . の正しい使い方を少し誤解しているようmoveToPoint:です。実際には何も描画せずに、カーソルを移動する方法と考えてください。「ここから描き始めたい」という言い方に過ぎません。描画自体は他の方法で実行できます。たとえば、一辺の長さがLの正方形を描きたい場合は、次のようにすることができます。

// 'shape' is a UIBezierPath
NSInteger L = 100;
CGPoint origin = CGPointMake(50, 50);
[shape moveToPoint:origin]; // Initial point to draw from
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y)]; // Draw from origin to the right
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y+L)]; // Draw a vertical line
[shape addLineToPoint:CGPointMake(origin.x, origin.y+L)]; // Draw bottom line
[shape addLineToPoint:origin]; // Draw vertical line back to origin

このコードはまったくテストされていませんが、 と の使用方法については理解できるはずmoveToPoint:ですaddLineToPoint:

于 2013-04-23T00:30:09.743 に答える
2

変換を適用する順序に注意する必要があり、変換を連結して一度に適用することを検討する必要があります。

各変換はパス内のすべての x、y 位置に影響するため、順序は重要です。したがって、翻訳はスケールの影響を受けます。順序を逆にすると、パスがスケーリングされてから移動します。

また、特にスケーリングする場合は、座標系も重要です。0,0 の周りを描画してから、スケーリングしてから変換してください。ポイントを正規化すると、これが最も簡単になります。緯度/経度の値の正規化とは、緯度を 90 で、経度を 180 で割ることを意味します (これにより、実際には -1..1 の範囲が得られます)。これを行うときは、最初にパスをスケーリングし、ビューの中心に移動してから、目的の移動を適用する必要があります。

于 2013-04-22T23:08:05.190 に答える