3

UIBezierPath (1 つの [0,0 - 1x1] 四角形で構築) を x 方向と y 方向の両方で 2 倍にスケーリングします。UIBezierPath ".bounds" は問題ありません (つまり、期待どおりにスケーリングされます) が、".CGPath" は変更されません...

コード:

#import <UIKit/UIKit.h>

int main(int argc, char *argv[])
{
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0,
                                                                     1, 1)];
    NSLog(@"path.bounds box before transform:%@",
          NSStringFromCGRect(path.bounds));
    NSLog(@"path.CGPath box before transform:%@",
          NSStringFromCGRect(CGPathGetBoundingBox(path.CGPath)));

    [path applyTransform:CGAffineTransformMakeScale(2, 2)];

    NSLog(@"path.bounds box after transform:%@",
          NSStringFromCGRect(path.bounds));
    NSLog(@"path.CGPath box after transform:%@",
          NSStringFromCGRect(CGPathGetBoundingBox(path.CGPath)));

    return 0;        
}

出力:

path.bounds box before transform:{{0, 0}, {1, 1}}
path.CGPath box before transform:{{0, 0}, {1, 1}}
path.bounds box after transform:{{0, 0}, {2, 2}}
path.CGPath box after transform:{{0, 0}, {1, 1}}

なんで?

4

2 に答える 2

7

iOS 5.1 の時点で、CGPath返された fromUIBezierのプロパティは、 に新しい変換が適用される.CGPathと実際に更新されます。UIBezierPath

ただし、これは古い iOS バージョンの解決策を妨げるものではありません。からを取得し、直接変換してCGPathから、に戻すことができます。見よ、境界や起点などの他のすべてのプロパティは、正しくすぐに更新されます。UIBezierPathUIBezierPath

UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(0.0f, 0.0f,
                                                                 1.0f, 1.0f)];

CGAffineTransform transform = CGAffineTransformMakeScale(2.0f, 2.0f);
CGPathRef intermediatePath = CGPathCreateCopyByTransformingPath(path.CGPath,
                                                                &transform);

path.CGPath = intermediatePath;

CGPathRelease(intermediatePath);
于 2012-07-25T02:53:23.607 に答える
4

この違いの理由は、applyTransform の呼び出しがパス オブジェクトに変換行列を格納するだけだからです。パス自体が変更されることはありません。path.bounds は、変換を使用して導出される計算されたプロパティですが、CGPathGetBoundingBox の呼び出しは、渡された CGPath オブジェクトの要素を単純に繰り返します。

多数のパス要素が存在する可能性があるため、変換行列を保存し、新しい行列が割り当てられるたびにすべてのパス要素を変更しないことは、最適化として行われます。この作業は、UIBezierPath の境界などの特定のプロパティのみがクエリされる場合に、1 回または最小限に実行されます。

于 2011-10-31T07:28:39.797 に答える