Проблема захвата выбранных представлений по мере их появления на экране с помощью renderInContext в Swift

У меня есть три вида раскадровки: viewA, viewB, viewC.

Я пытаюсь сделать снимок экрана только в двух видах, когда они появляются на экране в их текущем месте, viewB и viewC.

Проблема в том, что когда я их визуализирую, полученное изображение показывает viewB и viewC в неправильных местах, положение видов изменяется, перемещаясь вверху слева (0, 0), см. Изображение.

Как мне исправить приведенный ниже код, чтобы я мог захватывать представления viewB и viewC точно так, как они расположены в представлении, используя реализацию renderInContext ниже?

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

введите здесь описание изображения


person user4806509    schedule 06.04.2016    source источник


Ответы (1)


Из документов для renderInContext::

Визуализирует в координатном пространстве слоя.

Каждый слой представления имеет начало координат 0,0, поэтому каждый из них отображается в верхнем левом углу.

Чтобы исправить это, вам нужно перевести контекст графики по происхождению вида перед вызовом renderInContext:.

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
let ctx = UIGraphicsGetCurrentContext()

CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewB.frame.origin.x, self.viewB.frame.origin.y)
self.viewB.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)

CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, self.viewC.frame.origin.x, self.viewC.frame.origin.y)
self.viewC.layer.renderInContext(UIGraphicsGetCurrentContext()!)
CGContextRestoreGState(ctx)

let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
person rmaddy    schedule 06.04.2016
comment
Спасибо за ваш ответ @rmaddy. Как конкретно перевести графический контекст? - person user4806509; 06.04.2016
comment
Смотрите мое обновление. Я считаю, что это правильно. Это не проверено. - person rmaddy; 06.04.2016
comment
Спасибо @rmaddy. Я проверил это, и это работает. Мне пришлось изменить -self.viewC на self.viewC, удалив -, чтобы он заработал. С тех пор я добавил новое представление, и у меня возникли проблемы с его захватом по какой-то причине, оно никогда не отображается, я подозреваю, что это может быть связано с автоматическими ограничениями, но не уверен, почему, что я исследую. - person user4806509; 06.04.2016
comment
Этот ответ + stackoverflow.com/ questions/23110601/ — это именно то, что нужно. ТАК люблю :-) - person byemute; 01.11.2018