1

UIImageViewこの方法で、下に 1 つ、オーバーレイに 1 つの二重レイヤーを作成します。

UIImage *bottomImage = self.imageView.image;
UIImage *image       = self.urlFoto.image;

CGSize newSize = CGSizeMake(640, 640);
UIGraphicsBeginImageContext( newSize );

[bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

この後、ピンチ ジェスチャで画像のサイズを変更するメソッドを追加します。

- (IBAction)scaleImage:(UIPinchGestureRecognizer *)recognizer {

    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1;
}

しかし、フォトライブラリに写真を保存すると、オーバーレイの現在のサイズを取得できず、オーバーレイ (画像) に同じサイズの 640,640 が表示されます。見逃したコードは次のとおりです。

[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0];

ピンチ後のCGRectMake(0,0,newSize.width,newSize.height)現在のサイズを取得する正しい方法を知っていますか?UIImageView

4

2 に答える 2

2

描画するときは、スケール変換を念頭に置いておく必要があります。UIImageViewしたがって、ジェスチャによって調整された最終的なスケールに関して、オーバーレイ画像を描画する必要があります。

次のようにして、ビューの最終的な縮尺を取得できます。

CGFloat scale = view.transform.a;

ここで手紙aは重要です。幅変換の値です。したがって、画像を比例してスケーリングしていると仮定して、それを使用して共通のスケールを取得できます(幅と高さのスケールは同じです)


スケールに関するもう少しの詳細:

CGAffineTransformのように定義された構造体です

struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};

CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)

ドキュメントに従って次のことを行います

`(sx, sy)' でスケールする変換を返します:

t' = [ sx 0 0 sy 0 0 ]

理解を深めるために、次のサンプル コードを参照してください。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];

view.transform = CGAffineTransformScale(view.transform, 0.5, 0.5);
NSLog(@"Transform 1: %f", view.transform.a);

view.transform = CGAffineTransformScale(view.transform, 0.5, 0.5);
NSLog(@"Transform 2: %f", view.transform.a);

コンソールに次のように表示されます。

Transform 1: 0.500000
Transform 2: 0.250000
  1. 最初の変換は、0.5 をデフォルトのスケール 1.0 にスケールします。
  2. 2 番目の変換は、0.5 スケールを既にスケーリングされた 0.5 にします -> 現在の 0.5 に新しい 0.5 スケールを乗算します
于 2013-09-24T13:58:44.023 に答える
0

Step 1: .h ファイルで宣言

CGFloat lastScale;

Step 2: in .m ファイルでジェスチャー メソッドを置き換えます

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

        // Calculate the New Scale of UIImageView
        CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]);

        // Store Your Imageview's transform
        CGAffineTransform transorm = simageView.transform;
        // Convert your Imageview to Identity (original Size)
        [imageView setTransform:CGAffineTransformIdentity];
        // Save Rect Of UIImageView
        CGRect actualRect = self.view.frame;
        // Apply Transform to Imageview to make it scaled
        [imageView setTransform:transorm];

        // Now calculate new frame size of your ImageView
        NSLog(@"width %f height %f",(imageView.frame.size.width*newScale), (imageView.frame.size.height*newScale));
    }
}
于 2013-09-24T15:00:18.987 に答える