1

アニメーションで使用する別のコントローラーのビューのスナップショットを取得しようとしています。次のコードを使用していますが、そのビューの背景色とそのサブビュー(2つのボタン、テキストビュー、およびラベル)は表示されません。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    FirstPageController *fpController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstPage"];
    UIGraphicsBeginImageContext(fpController.view.bounds.size);
    NSLog(@"%@",fpController.view.subviews);
    [fpController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGSize destinationSize = CGSizeMake(90, 122);

    UIGraphicsBeginImageContext(destinationSize);
    [viewImage drawInRect:CGRectMake(0,0,destinationSize.width,destinationSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    self.imageView2 = [[UIImageView alloc] initWithImage:newImage];
    self.imageView2.center = self.view.center;
    [self.view addSubview:self.imageView2];
     NSLog(@"%@",NSStringFromCGSize(self.imageView2.image.size));
}

fpController、imageView、imageなど、関連するすべてのものをログに記録しましたが、すべて正しくログに記録されています。

編集後:現在のコントローラーのビューに切り替えると正常に動作するので、これは画面に表示されていないビューのスナップショットを取得することと関係があると思います。それはできますか?

4

3 に答える 3

3

これがあなたに役立つことを願っています:

 CGSize textcontent =CGSizeMake(width, height);
UIGraphicsBeginImageContext(textcontent);
if ([UIScreen instancesRespondToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0f)
{
    UIGraphicsBeginImageContextWithOptions(textcontent, YES, 1.0f);
}
else
{
    UIGraphicsBeginImageContext(textcontent);
}
    [image.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
于 2012-12-21T05:34:10.410 に答える
1
UIGraphicsBeginImageContextWithOptions(fpController.view.bounds.size, NO, 0.0);


UIGraphicsBeginImageContextWithOptions(destinationSize, NO, 0.0);

代わりにこの2行を使用してくださいUIGraphicsBeginImageContext(fpController.view.bounds.size);

 UIGraphicsBeginImageContext(destinationSize); respectively 

それがあなたの助けになることを願っています

于 2012-12-21T05:27:08.287 に答える
0

ハックのように見えますが、これを機能させる1つの方法を見つけました。レンダリングするビューをビューのサブビューとして追加し、レンダリングを実行してから、ビューを削除します。画面には表示されないので、視覚的には問題ありません。もっと良い方法があるのだろうか。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.fpController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstPage"];

    [self.view insertSubview:self.fpController.view belowSubview:self.view];

    UIGraphicsBeginImageContext(self.fpController.view.bounds.size);
    [self.fpController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.fpController.view removeFromSuperview];

    self.imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 90, 122)];
    self.imageView2.image = viewImage;
    [self.pageView insertSubview:self.imageView2 belowSubview:self.imageView];
}
于 2012-12-21T07:05:23.770 に答える