0

私は次のような状況にあり、写真エディタを作成しようとしています。ビューの中心付近で画像の拡大縮小、変換、回転操作を行う必要があります

問題は、90度の翻訳後に翻訳を適用すると、左が翻訳の上になり、翻訳後にアンカーポイントがビューの中心にならないことです

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // ImageView
    v = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
    [v setBackgroundColor:[UIColor redColor]];

    // ImageView's Image
    UIImage *img = [UIImage imageNamed:@"_my.jpg"];
    [v setImage:img];
    v.contentMode = UIViewContentModeScaleAspectFit;
    v.layer.anchorPoint = CGPointMake(0.5, 0.5);
    [self.view setBackgroundColor:[UIColor clearColor]];

    // UiView containing ImageView
    vc = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 768, 500)];
    [vc addSubview:v];
    [self.view addSubview:vc];
}

- (IBAction)Click:(id)sender {
    // Translate
    if ([sender tag] == 1) {
        CGAffineTransform t0 = v.transform;
        CGAffineTransform t1 = CGAffineTransformTranslate(t0, 10.0, 0.0);
        v.transform = t1;
    }
    // Rotate
    if ([sender tag] == 2) {
        CGAffineTransform t0 = v.transform;
        CGAffineTransform t1 = CGAffineTransformRotate(t0, DEGREES_TO_RADIANS(10));
        v.transform = t1;
    }    
}

ビューの中心をアンカーポイントとして保持し、回転後に正しく機能するように変換する方法を知っている人はいますか?

TX

4

1 に答える 1

0

Origin による変換

ただし、特に 2D では、変換に原点ディスプレイスメントを頻繁に追加する必要があります。これは通常、最初に追加され、否定する必要もあります。

// 原点を持つワールド マトリックス

-OriginTranslation * Scale * Rotation * PositionTranslation

ビュー マトリックスでも同じことができますが、最後に追加し、今回は否定しません。

// 原点で行列を表示

-PositionTranslation * -Rotation * Zoom * OriginTranslation

選択的起源による変換

原点の変位が必要であるが、スケールと回転のみに影響を与え、移動には影響を与えたくない場合もあります。これを処理する方法は、翻訳コンポーネントに到達する前に元の変換を元に戻すことです。たとえば、ワールド マトリックスを使用すると、次のようになります。

変換がビューにどのように適用されているか正確には覚えていません。そのうちの1つが機能するはずです。

// スケールと回転の原点を持つワールド マトリックス

-OriginTranslation * Scale * Rotation * OriginTranslation * PositionTranslation

そしてビューマトリックス:

// 原点で行列を表示

-PositionTranslation * -OriginTranslation * -Rotation * Zoom * OriginTranslation

原点のない変換の例、順序: スケール * 回転 * 平行移動

ここに画像の説明を入力

于 2013-05-17T08:29:47.100 に答える