9

ビューには、フレーム (スーパービューの座標系の座標) と境界 (独自の座標系の座標) の両方のプロパティがありますが、ビューを変換する場合は、フレーム プロパティを使用したり依存したりしないでください。変換を使用している場合、変換は境界に適用されますが、必ずしもフレームに正確に反映されるとは限らないため、フレーム プロパティではなく、境界プロパティのみを操作します。

http://iphonedevelopment.blogspot.jp/2008/10/demystifying-cgaffinetransform.html

私は彼が上のパラグラフで何を意味するのかを知りたかったので、'frame' と 'bounds' を印刷
しました。

- (IBAction)handlePinch:(UIPinchGestureRecognizer*)recognizer
{
    NSLog(@"scale: %f, velocity: %f", recognizer.scale, recognizer.velocity);
    NSLog(@"Before, frame: %@, bounds: %@", NSStringFromCGRect(recognizer.view.frame), NSStringFromCGRect(recognizer.view.bounds));
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    NSLog(@"After, frame: %@, bounds: %@", NSStringFromCGRect(recognizer.view.frame), NSStringFromCGRect(recognizer.view.bounds));

    recognizer.scale = 1;
}

出力:(ズームイン)

2012-07-02 14:53:51.458 GestureRec[1264:707] scale: 1.030111, velocity: 0.945660
2012-07-02 14:53:51.466 GestureRec[1264:707] Before, frame: {{0, 124}, {320, 160}}, bounds: {{0, 0}, {320, 160}}
2012-07-02 14:53:51.473 GestureRec[1264:707] After, frame: {{-4.81771, 121.591}, {329.635, 164.818}}, bounds: {{0, 0}, {320, 160}}
2012-07-02 14:53:51.480 GestureRec[1264:707] scale: 1.074539, velocity: 1.889658
2012-07-02 14:53:51.484 GestureRec[1264:707] Before, frame: {{-4.81771, 121.591}, {329.635, 164.818}}, bounds: {{0, 0}, {320, 160}}
2012-07-02 14:53:51.494 GestureRec[1264:707] After, frame: {{-17.103, 115.449}, {354.206, 177.103}}, bounds: {{0, 0}, {320, 160}}
2012-07-02 14:53:51.499 GestureRec[1264:707] scale: 1.000000, velocity: 1.889658
2012-07-02 14:53:51.506 GestureRec[1264:707] Before, frame: {{-17.103, 115.449}, {354.206, 177.103}}, bounds: {{0, 0}, {320, 160}}
2012-07-02 14:53:51.510 GestureRec[1264:707] After, frame: {{-17.103, 115.449}, {354.206, 177.103}}, bounds: {{0, 0}, {320, 160}}

私は何かを誤解していますか、それともブログの著者が間違っていますか?

4

1 に答える 1

7

私はそれを持っていると思います:

Apple自身によると、ブログは正しいです:

座標系を変換またはスケーリングするには、ビューの境界長方形を変更します...

ただし、長方形自体は報告したのと同じサイズのままであるため、境界は変更されません。座標系のみがそれに合わせてスケーリングされています。分かりますか:

境界の四角形を変更すると、ビューによって実行されるすべての描画が開始される基本的な座標系が設定されます。

また、境界を明示的に変更することはないため、スーパービューに関連するビューのフレームのみが変更されます。

実際、境界が決して変わらないことを数学的に証明できます。ここでは、代わりにこのサンプルを実行します。

NSLog(@"scale: %f, velocity: %f", recognizer.scale, recognizer.velocity);
    NSLog(@"Before, frame: %@, bounds: %@", NSStringFromCGRect(recognizer.view.frame), NSStringFromCGRect(recognizer.view.bounds));
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    NSLog(@"After, frame: %@, bounds: %@ transform:%@", NSStringFromCGRect(recognizer.view.frame), NSStringFromCGRect(recognizer.view.bounds), NSStringFromCGAffineTransform(recognizer.view.transform));

    recognizer.scale = 1;

お気付きのように、境界を乗算して報告された値はNSStringFromCGAffineTransform()、ビューのフレームに相当します。しかし、ブログが言ったことはどうですか?必ずしも正確である必要はありません。変換行列は、この物体の x と y 以外にも適用できます。本当に必要な場合は、z 値を変換し、回転、反転、およびあらゆる方法で、これらすべてが非線形の方法でフレーム プロパティを変更できます。 、特にタンダムで使用する場合。

私がそう言うなら、興味深い難問です。

于 2012-07-02T06:06:58.177 に答える