Мне нужно захватить UIView и все, что он рассматривает в UIImage. Проблема в том, что часть представления отключена от экрана, поэтому я не могу использовать функцию захвата экрана, и когда я пытаюсь использовать функцию UIGraphicsGetImageFromCurrentImageContext(), она, похоже, также не захватывает subviews. Должен ли он захватить подпункты, и я просто делаю что-то неправильно? Если нет, есть ли другой способ сделать это?
Необходимо захватить UIView в UIImage, включая все подпункты
Ответ 1
Правильный путь:
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Этот метод является методом расширения класса UIImage, и он также позаботится о том, чтобы изображение выглядело хорошо на любых будущих устройствах с высоким разрешением.
Ответ 2
Вы имеете в виду
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer drawInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
не работает? Я уверен, что это должно...
Ответ 3
Здесь версия Swift 2.x, которая должна работать, если вы сначала создадите массив UIViews для выравнивания:
// Flattens <allViews> into single UIImage
func flattenViews(allViews: [UIView]) -> UIImage? {
// Return nil if <allViews> empty
if (allViews.isEmpty) {
return nil
}
// If here, compose image out of views in <allViews>
// Create graphics context
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale)
let context = UIGraphicsGetCurrentContext()
CGContextSetInterpolationQuality(context, CGInterpolationQuality.High)
// Draw each view into context
for curView in allViews {
curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false)
}
// Extract image & end context
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Return image
return image
}