Прежде всего, я хотел бы поблагодарить sergio ... его ответ помог мне начать работу, но я решил поделиться некоторыми кодами, которые я не нашел очевидными, которые мне нужно было написать, чтобы заставить его работать:
Вот как сделать миниатюру для страницы без ее отображения:
// Your width and height can be whatever you like, but if you want this to render
// off screen, you need an x and y bigger than the superview's width and height
UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(largerScreenDimension, largerScreenDimension, largerScreenDimension, largerScreenDimension)];
[self.view addSubview:webView]; // UIWebViews without an assigned superview don't load ever.
webView.delegate = self; // or whoever you have implement UIWebViewDelegate
webView.scalesToFit = YES; // This zooms the page appropriately to fill the entire thumbnail.
[webView loadRequest:[NSURLRequest requestWithURL:url]];
Затем реализуйте это в своем делегате:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
UIGraphicsBeginImageContext(webView.bounds.size);
[webView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *webViewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *thumbnailData = UIImagePNGRepresentation(webViewImage);
[webView removeFromSuperview];
}
Наконец, чтобы отобразить этоthumbnail вам понадобится что-то вроде:
thumbnailImageView.image = [UIImage imageWithData:thumbnailData];
В качестве бонуса, о котором я упомяну, я хотел, чтобы сразу создавалось несколько миниатюр.Я обнаружил, что использование objc_setAssociatedObject()
и objc_getAssociatedObject()
очень полезно для отслеживания того, какой веб-вид загружает какой эскиз.Однако вдаваться в подробности о том, как это работает, выходит за рамки этого вопроса.