Посмотрите на скриншот ниже.
View hierarchy
-self.view
-blueView (subview of self.view)
-redView (subview of self.view)
полноразмерный снимок экрана
Обратите внимание, как цель снимка экрана (на основе X = 0 и Y = множитель screen.y) отличается в зависимости от размера устройства? С помощью прилагаемого расширения вы можете решить вышеуказанную проблему несколькими различными способами в зависимости от иерархии представления. Если ваша иерархия остается такой, как указано выше, вы можете сделать что-то вроде этого:
Вариант 1 Если вы хотите сделать снимок экрана с информацией о том, что находится внутри blueView, вы можете сделать это: (для этого blueView это либо IBOutlet, либо свойство, которое устанавливается программно)
let image = self.view.screenshot(for: blueView.frame, clipToBounds: true, with: UIImage(named: "star”))
Выше приведен снимок экрана self.view в данном прямоугольнике для всех подпредставлений self. Посмотреть. (вывод ниже)
Вариант 2 Если иерархия вашего представления изменяется примерно так: -self.view - blueView (подпредставление self.view)- redView (подпредставление blueView)
И вы хотите сделать снимок только blueView и подпредставлений, затем вы можете упростить вышеупомянутое, выполнив:
let image = blueView.screenshot(for: blueView.bounds, with: UIImage(named: "star”))
Это работает, потому что redViewподпредставление blueView (вывод такой же, как на скриншоте выше)
Вариант 3 Теперь предположим, что вы хотите сделать снимок экрана self.view в центре с размером снимка экрана 300, после чего вы можетесделать что-то вроде этого
let size = CGSize(width: 300, height: 300) // notice this is bigger than blueView size
let rect = CGRect(origin: CGPoint(x: self.view.center.x - size.width / 2, y: self.view.center.y - size.height / 2), size: size)
let image = self.view.screenshot(for: rect, clipToBounds: false, with: UIImage(named: "star"))
Можно ли все это оптимизировать? ДА, но я пытаюсь объяснить вам шаг за шагом. (ниже вывод этого)
Кстати, звезда на этих скриншотах является водяным знаком
Для тех, кому интереснорасширение ОП происходит от этого ответа , и оно немного обновилось с момента появления этого вопроса.