8

画面に追加せずに、ペン先からビューをロードして構成し、スナップショットを取得しようとしています:

+ (void)composeFromNibWithImage:(UIImage*)catImage completion:(CompletionBlock)completion {

    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"CatNib" owner:nil options:nil];
    CatView *catView = [nibContents firstObject];

    //here, catView is the correct size from the nib, but is blank if inspected with the debugger

    catView.catImageView.image = catImage;
    catView.furButton.selected = YES;    
    UIImage *composite = [UIImage snapshot:catView];
    completion(composite);
}

ここで、スナップショットが典型的です:

+ (UIImage *)snapshot:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

ただし、catView とコンポジットの両方が正しくサイズ設定されていますが、コードをステップ実行すると空白になります。画面にビューを追加せずに、ペン先からロードされたビューから UIImage を作成するにはどうすればよいですか?

4

3 に答える 3

3

しばらく前に同様の問題がありましたが、実際は画面に表示されていないビューのスナップショットを作成することはできません。回避策を作成し、スナップショットを作成したい関連ビューを現在の ViewControllers ビュー境界の外に配置して、表示されないようにしました。この場合、有効なスナップショットを作成できました。お役に立てれば :)

于 2015-02-16T23:46:33.963 に答える
2

これは少しハッキーに感じますが、試してみたところ、仕事は完了しました。メイン ビューの背後にある nib からビューをロードすると、そのレイヤーだけのスクリーンショットを撮ることができます。メモリを集中的に使用するビューでない限り、ユーザーはそのビューがスーパー ビューに追加されたことを知ることはありません。

UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height));
CGContextRef context = UIGraphicsGetCurrentContext();
[catView.layer renderInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

したがって、メイン ビューの後ろに nib をロードした後に、このコードを実行してください。ロードしたら、`[catView removeFromSuperiew]' で削除できます。

于 2015-02-16T23:40:02.083 に答える
0
    UIGraphicsBeginImageContext(view.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
于 2015-02-23T12:49:53.040 に答える