Необходимо захватить UIView в UIImage, включая все подпункты - программирование

Необходимо захватить UIView в UIImage, включая все подпункты

Мне нужно захватить UIView и все, что он рассматривает в UIImage. Проблема в том, что часть представления отключена от экрана, поэтому я не могу использовать функцию захвата экрана, и когда я пытаюсь использовать функцию UIGraphicsGetImageFromCurrentImageContext(), она, похоже, также не захватывает subviews. Должен ли он захватить подпункты, и я просто делаю что-то неправильно? Если нет, есть ли другой способ сделать это?

4b9b3361

Ответ 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
}