3

Core Graphics を使用してUIViewのスクリーンショットを撮り、その View の上に配置します (後でアニメーション化できるようにします)。

// Get the screen shot
UIGraphicsBeginImageContextWithOptions(target.bounds.size, YES, [[UIScreen mainScreen] scale]);
[target.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIImageView * ss = [[UIImageView alloc] initWithImage:image];

// Add it to the View
[overlay addSubview:ss];
[target addSubview:overlay];

問題: 私の UIViewtargetには、目に見えないアイテムがいくつかあります (両方を試しalpha = 0ましhidden = YESた)。これらの目に見えないアイテムがスクリーンショットに表示されています。

これらの目に見えないアイテムを表示せずにスクリーンショットを撮るにはどうすればよいですか?

更新: Technical Q&A QA1703: Screen Capture in UIKit Applications のコードを使用してみましたが、同じ問題が発生しています。

更新 #2: CATransform3D が適用されたビューで問題が発生するようです。3D サブビューを持つ別の親ビューでは、このスクリーンショットが撮影されると、ビューから 3D 効果が削除され、フラット (2D) に表示されます。

4

2 に答える 2

1

非表示のビューをスーパービューから削除してみませんか。その後、スクリーンショットには表示されません。

[hiddenView removeFromSuperview];

編集:

どのサブビューが非表示になっているかわからない場合は、確認できます。次のコードは、ビューからすべての非表示のサブビューを削除し、それらを再度追加します。

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(UIView *subView, NSDictionary *bindings) {
    return subView.hidden;
}];

NSArray *hiddenViews = [[myView subviews] filteredArrayUsingPredicate: predicate];

for (UIView *subView in hiddenViews) {
    [subView removeFromSuperview];
}

//take your screenshot here

for (UIView *subView in hiddenViews) {
    [myView addSubview:subView];
}

EDIT2: Duncan C が指摘したように、これはネストされたサブビューでは機能しません。これには再帰的な方法が必要です。

于 2012-09-05T19:41:35.827 に答える
0

非表示になっているだけでなく、CATransform3D が適用されていることが問題のようです。

スタック オーバーフローの質問"renderInContext:" と CATransform3Dには詳細情報がありますが、要点は次のとおりです。

QCCompositionLayer、CAOpenGLLayer、および QTMovieLayer レイヤーはレンダリングされません。さらに、3D 変換を使用するレイヤーはレンダリングされず、backgroundFilters、フィルター、compositingFilter、またはマスク値を指定するレイヤーもレンダリングされません。

CALayerのドキュメントから)。

アプリがアプリ ストアに公開されない場合は、文書化されていないUIGetScreenImageAPIを使用できます。

// Define at top of implementation file
CGImageRef UIGetScreenImage(void);

...

- (void)buttonPressed:(UIButton *)button
{
  // Capture screen here...
  CGImageRef screen = UIGetScreenImage();
  UIImage* image = [UIImage imageWithCGImage:screen];
  CGImageRelease(screen);

  // Save the captured image to photo album
  UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

ジョン・ムーチョより

ただし、この API を使用すると、アプリが承認されなくなります。

他の回避策を見つけることができませんでした。

于 2012-09-12T13:17:32.370 に答える