Как сделать снимок экрана для всего экрана, независимо от того, какое приложение находится на первом месте в 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 в изображение.
надеюсь, что это полезно.