Как сделать снимок экрана для всего экрана, независимо от того, какое приложение находится на первом месте в iOS 7 (Jailbroken)

Перед iOS7 я использую функцию UIGetScreenImage(), чтобы сделать снимок экрана легко, но в iOS7 он становится устаревшим, теперь есть хорошие методы для его архивирования? Спасибо!

Дополнение: Мне нужно сделать снимок экрана для всего экрана в любом представлении

Ответы

Ответ 1

Я столкнулся с одной и той же проблемой, но у меня нет идей, как ее решить.

Я попробовал IOSurface - IOS Private API - Снимок экрана в фоновом режиме, который хорошо работает в некоторых приложениях, но возвращает черный экран в играх.

Затем я попробовал это приложение https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m, которое хорошо работает с использованием private apis, но я не могу его скомпилировать с помощью theos, всегда говоря мне "Undefined символы для архитектуры armv7: CARenderServerRenderDisplay". Edit: Я понял, как скомпилировать его с помощью theos, но возвращает пустое изображение.

Кроме того, https://github.com/coolstar/RecordMyScreen хорошо работает в iOS7, но теперь он не открывается, поэтому я не могу узнать, как он захватывает весь экран.

Изменить: RecordMyScreen работает на iOS7 в качестве настройки плагинов, вы можете обратиться к этому файлу https://github.com/coolstar/RecordMyScreen/blob/master/RecordMyScreen/CSScreenRecorder.m этот метод "- (void) _captureShot: (CMTime) frameTime;"

Ответ 2

Альтернативный способ заменить UIGetScreenImage()

CGImageRef screen = UIGetScreenImage();

Вышеприведенный код представляет собой одну строку кода для захвата экрана, но Apple не открывает вышеприведенный API UIGetScreenImage() для общедоступного приложения. т.е. не загружать в Apple для утверждения. Таким образом, альтернативный способ захвата экрана и сохранения его приведен ниже.

- (void)captureAndSaveImage
{    

    // Capture screen here... and cut the appropriate size for saving and uploading
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // crop the area you want 
    CGRect rect;
    rect = CGRectMake(0, 10, 300, 300);    // whatever you want
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *img = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
    UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    imageView.image = img; // show cropped image on the ImageView     
}

// this is option to alert the image saving status
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    UIAlertView *alert;

    // Unable to save the image  
    if (error)
        alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                                           message:@"Unable to save image to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Dismiss" 
                                 otherButtonTitles:nil];
    else // All is well
        alert = [[UIAlertView alloc] initWithTitle:@"Success" 
                                           message:@"Image saved to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Ok" 
                                 otherButtonTitles:nil];
    [alert show];
    [alert release];
}

какая-то ссылка поможет вам how-to-legally-replace-uigetscreenimage

Ответ 3

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

Этот код поможет вам получить скриншот self.view, который представляет собой весь экран iPhone, независимо от того, какое приложение находится впереди. Если вы использовали какие-либо слои в своем представлении то слои не будут включены в скриншот и для этого вы должны использовать self.view.layer.

Ответ 4

У класса UIView есть метод, называемый: resizableSnapshotViewFromRect: afterScreenUpdates: withCapInsets.

Но я никогда не работал с этим методом, поэтому я больше не могу рассказать об этом.

И этот пост: Capture UIView как UIImage показывает, как вы получите возвращенный UIView в изображение.

надеюсь, что это полезно.