1

UIGraphicsGetImageFromCurrentImageContextを使用して変換した後、ビューとそのコンテンツをレンダリングしようとしています。ビューを縮小しても、レンダリングすると画像サイズは正しいのですが、コンテンツは元のサイズでレンダリングされます(この場合、期待どおりにビューに収まるのではなく、トリミングされます。

ここに画像の説明を入力してください

ここに簡単なサンプルプロジェクトがあります:http://owolf.net/uploads/StackOverflow/ParentChildTransformTester.zip

さらに説明すると、親ビューと子ビューを作成し、子をサブビューとして追加します。次に、親ビューのスケールを変換します。これにより、子のサイズも変更されます(必要に応じて)。次に、親ビューの現在のフレームサイズで画像コンテキストを作成し、レンダリングします。以下のコード。

//create views
UIView *parentView = [[UIView alloc]initWithFrame:self.view.bounds];
[parentView setBackgroundColor:[UIColor orangeColor]];
[self.view addSubview:parentView];

UIView *childView = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];
[childView setBackgroundColor:[UIColor redColor]];
[parentView addSubview:childView];

//log parent view size : result is device screen size
NSLog(@"parentView.frame.size, BEFORE tran: %f x %f", parentView.frame.size.width, parentView.frame.size.height);

float scaleFactor = 0.2;
CGAffineTransform trans = CGAffineTransformScale(CGAffineTransformIdentity, scaleFactor, scaleFactor);
parentView.transform = trans;

//log parent view size after transform :  result is device screen size * 0.2
NSLog(@"parentView.frame.size, AFTER tran: %f x %f", parentView.frame.size.width, parentView.frame.size.height);


//attemt to render and save scaled parent view.
CGSize renderSize = CGSizeMake(parentView.frame.size.width, parentView.frame.size.height);
UIGraphicsBeginImageContext(CGSizeMake(renderSize.width, renderSize.height));

[[parentView layer] renderInContext:UIGraphicsGetCurrentContext()];

UIImage *renderedImage;
renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageWriteToSavedPhotosAlbum(renderedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
4

2 に答える 2

0

レイヤーをレンダリングする前に、現在の変換マトリックスに変換を適用する必要があります。

...
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextConcatCTM(ctx, [[parentView layer] affineTransform]);

[[parentView layer] renderInContext:ctx];
...
于 2013-02-27T07:20:26.087 に答える
0

これは機能しました:上記のGraverの回答に従って変更されました。

UIGraphicsBeginImageContext(parentView.frame.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextConcatCTM(ctx, [[parentView layer] affineTransform]);
[[parentView layer] renderInContext:UIGraphicsGetCurrentContext()];
renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(renderedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
于 2013-02-27T07:29:31.543 に答える