ios - 从屏幕截图中删除状态栏条

标签 ios objective-c cocoa-touch

当我使用下面的代码以编程方式拍摄屏幕截图时,它会在状态栏应该出现的位置留下一条白色 strip 。我知道您无法捕获状态栏,但我只想剪掉白色空白条。

- (UIImage*)captureView:(UIView *)view
{
CALayer *layer = [[UIApplication sharedApplication] keyWindow].layer;
CGFloat scale = [UIScreen mainScreen].scale;
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, scale);

[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;

}

最佳答案

我从另一个问题中复制了我的答案 https://stackoverflow.com/a/16067463/837244 ,它应该可以解决您的问题:

我以前在小类下面写过这个。你可以利用它。后一个函数获取全屏截图(而且是从apple的guide获取的,绝对安全)。我添加的第一部分处理不同的尺度(视网膜或常规)。可能会有所帮助。

#import "ScreenshotTaker.h"
#import <QuartzCore/QuartzCore.h>

@implementation ScreenshotTaker


+(UIImage *) captureRectOfScreen:(CGRect) rect
{
    UIImage *wholeScreen = [ScreenshotTaker screenshot];

    //Add status bar height
    rect.origin.y += UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ? [[UIApplication sharedApplication] statusBarFrame].size.width : [[UIApplication sharedApplication] statusBarFrame].size.height;

    //NSLog(@"%@",NSStringFromCGSize([wholeScreen size]));

    CGFloat scale = wholeScreen.scale;

    rect.origin.x *= scale;
    rect.origin.y *= scale;
    rect.size.width *= scale;
    rect.size.height *= scale;

    UIImage *cropped = [UIImage imageWithCGImage:CGImageCreateWithImageInRect([wholeScreen CGImage], rect) scale:wholeScreen.scale orientation:wholeScreen.imageOrientation];

    //NSLog(@"Whole Screen Capt :%@ Scale: %f",NSStringFromCGSize([wholeScreen size]), wholeScreen.scale);
    //NSLog(@"Rect to Crop :%@ Cropped :%@",NSStringFromCGRect(rect), NSStringFromCGSize([cropped size]));

    return cropped;
}

+(UIImage *) screenshot
{
    // Create a graphics context with the target size
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;
    if (NULL != UIGraphicsBeginImageContextWithOptions)
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    else
        UIGraphicsBeginImageContext(imageSize);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Iterate over every window from back to front
    for (UIWindow *window in [[UIApplication sharedApplication] windows])
    {
        if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
        {
            // -renderInContext: renders in the coordinate space of the layer,
            // so we must first apply the layer's geometry to the graphics context
            CGContextSaveGState(context);
            // Center the context around the window's anchor point
            CGContextTranslateCTM(context, [window center].x, [window center].y);
            // Apply the window's transform about the anchor point
            CGContextConcatCTM(context, [window transform]);
            // Offset by the portion of the bounds left of and above the anchor point
            CGContextTranslateCTM(context,
                                  -[window bounds].size.width * [[window layer] anchorPoint].x,
                                  -[window bounds].size.height * [[window layer] anchorPoint].y);

            // Render the layer hierarchy to the current context
            [[window layer] renderInContext:context];

            // Restore the context
            CGContextRestoreGState(context);
        }
    }

    // Retrieve the screenshot image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}

@end

关于ios - 从屏幕截图中删除状态栏条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246490/

相关文章:

iphone - CLLocationManager 有没有可能被其他应用影响?

ios - 声明函数时 "-&gt;"在swift中意味着什么?

iphone - 设置 VC.view 出现在父 VC 的 View 中,不适合我

ios - 尝试在其 View 不在窗口层次结构中的 UIViewController 上呈现 UIViewController

objective-c - 获取当前系统时间?

objective-c - NSArray 上的 'void' 是什么?

ios - 如何使用 SwiftyJSON 从文件中保存/检索字典

objective-c - 获取所有已安装应用程序的列表

ios - 如何停止 iOS 在恢复时显示快照?

objective-c - UIScrollView,下拉效果类似CalcBot