скриншот функции расширения не захватывает одну и ту же область в iphone и ipad - PullRequest
0 голосов
/ 16 октября 2019

Я использую функцию расширения, чтобы сделать снимок экрана uiview. Проблема в том, что результаты выглядят совсем иначе. Я хочу, чтобы фотография выглядела одинаково, независимо от погоды, это ipad или iphone. Я вручную ввожу ограничения, поэтому ожидаю, что изображения будут одинаковыми. Я хочу, чтобы с помощью этой функции перейти в начало или центр видового контроллера и получить 200 высоту и 200 ширину. Таким образом, изображение должно быть одинаковым независимо от устройства, поскольку оно начинается в центре и имеет одинаковый размер.

     let vex = self.view.screenshot(for: CGRect(x: 0, y:UIScreen.main.bounds.size.height*0.65,, width: 100, height: 100), with: UIImage(named: "a.png"))

    extension UIView {
/// Takes a screenshot of a UIView, with an option to clip to view bounds and place a waterwark image
/// - Parameter rect: offset and size of the screenshot to take
/// - Parameter clipToBounds: Bool to check where self.bounds and rect intersect and adjust size so there is no empty space
/// - Parameter watermark: UIImage of the watermark to place on top
func screenshot(for rect: CGRect, clipToBounds: Bool = true, with watermark: UIImage? = nil) -> UIImage {
    var imageRect = rect
    if clipToBounds {
        imageRect = bounds.intersection(rect)
    }
    return UIGraphicsImageRenderer(bounds: imageRect).image { _ in
    drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
    watermark?.draw(in: CGRect(x: 0, y: 0, width: 32, height: 32))
    }
}}

IPHONE enter image description here

IPAD enter image description here

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Посмотрите на скриншот ниже.

View hierarchy   
 -self.view
   -blueView (subview of self.view) 
   -redView   (subview of self.view)

enter image description here полноразмерный снимок экрана

Обратите внимание, как цель снимка экрана (на основе 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. Посмотреть. (вывод ниже) enter image description here

Вариант 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"))

Можно ли все это оптимизировать? ДА, но я пытаюсь объяснить вам шаг за шагом. (ниже вывод этого) enter image description here

Кстати, звезда на этих скриншотах является водяным знаком

Для тех, кому интереснорасширение ОП происходит от этого ответа , и оно немного обновилось с момента появления этого вопроса.

0 голосов
/ 16 октября 2019
//you used this
y:UIScreen.main.bounds.size.width*0.65,

//try this
y:UIScreen.main.bounds.size.height*0.65,

Возможно, вы называли ширину для y вместо высоты :)

Редактировать: Выше было ошибкой, но не решило проблему. Вот еще одно возможное решение.

iPhone и iPad имеют разные размеры экрана. Попробуйте увеличить размер скриншота до 800x800 и посмотреть, возможно, координаты не так или иначе из-за размеров вашего экрана. Кажется, что ваш 200x200 не распространяется на графику, что приводит к другому результату.

...