0

スクリーンショットを撮る簡単なプログラムを作成します

目的は、フルスクリーンではないモーダルを表示するトリックです。presentingViewController のスクリーンショットを撮り、それをバックグラウンドで表示します。

#import <QuartzCore/CALayer.h>

@implementation UIView (screenshot)
- (UIImage*) screenshot
{
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return myImage;
}

@end

十分に単純です。

[BGMDCachedProperties singleton].screenShotOfLastPresentingController = self.navigationController.view.screenshot;//スクリーンショットを撮り、変数に入れます

次に、[[BGMDCachedProperties singleton].screenShotOfLastPresentingController saveScreenshot]; を実行します。

-(void)saveScreenshot{
    NSData * data = UIImagePNGRepresentation(self);
    NSString * documentDirectory= [BGMDApplicationsPointers applicationDocumentsDirectory];
    NSString * fileForDocumentDirectory = [documentDirectory stringByAppendingFormat:@"/%@",@"foo.png"];
    BOOL result = [data writeToFile:fileForDocumentDirectory atomically:YES];
    if (result)
    {

    }
}

これは私が得たものです: ここに画像の説明を入力

次に、その画像を表示することを目的としたモック viewController を表示します。たぶん、その foo.png を誤解しているだけでしょうか?わかるように背景を赤にしました

これは私が得たものです: ここに画像の説明を入力

これを行う必要があるため、明らかにそれは私の目的では機能しません。

ここに画像の説明を入力

最後に、スクリーンショットの上位 20 点を削除するだけで修正できました。

theScreenshot = theScreenshot.crop20PointsifStatusBarShowsUp;

-(UIImage*) crop20PointsifStatusBarShowsUp
{
    if ([BGMDApplicationsPointers statusBarShowUp])
    {
        CGRect newSize = CGRectMake(0, sizeOfStatusBar, self.size.width, self.size.height-sizeOfStatusBar);
        UIImage * newImage = [self cropUIImageWithCGRect:newSize];
        return newImage;
    }
    else{
        return [self copy];
    }
}

やっとうまくいきました: ここに画像の説明を入力 ただし、ユーザーがパーソナル ホットスポットを許可すると、代わりにステータス バーが 40 ポイントになります。

すべてのビューと同様に、ナビゲーションコントローラーは画面全体ではなく「利用可能な」画面のみを埋めることになっているのに、なぜ透明なストリップが navigationController.view に表示されるのだろうか。

また、ストリップのサイズを知るにはどうすればよいですか? ステータスバーがないときは0のときもあれば、20のときもあれば、40のときもあります。

これらの2つのコードを追加しました:

PO(NSStringFromCGRect(self.frame));
PO(NSStringFromCGSize(myImage.size));

そして得た:

2012-10-12 07:57:34.627 BadgerNew[3354:907] <0x1cdc8a60 UIView+screenshot.m:(21)> NSStringFromCGRect(self.frame): {{0, 0}, {320, 431}}
2012-10-12 07:57:34.629 BadgerNew[3354:907] <0x1cdc8a60 UIView+screenshot.m:(22)> NSStringFromCGSize(myImage.size): {320, 431}
4

1 に答える 1

0

なぜ私がストリップを手に入れるのか、私はまだ理解していません。navigationController.view は常に画面全体を埋め、ステータスバーを覆わないように透明な画面を表示するようです。

たとえば、modalViewController はステータス バーだけを表示します。

したがって、唯一の適切な解決策は、ステータス バーのサイズを計算して画像をトリミングすることです。

-(UIImage*) crop20PointsifStatusBarShowsUp
{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    float sizeOfStatusBarVar= applicationFrame.origin.y;
    if ([BGMDApplicationsPointers statusBarShowUp])
    {
        CGRect newSize = CGRectMake(0, sizeOfStatusBarVar, self.size.width, self.size.height-sizeOfStatusBarVar);
        UIImage * newImage = [self cropUIImageWithCGRect:newSize];
        return newImage;
    }
    else{
        return [self copy];
    }
}

プライベート ホット スポットがある場合、ステータス バーのサイズは多くの場合 40 であるため、プログラムで計算する必要があります。

于 2012-10-12T01:14:23.470 に答える