Swift

Exponer la vista raíz para la captura a pantalla completa

Para capturar toda la pantalla de la aplicación, necesitas acceder a la raíz UIView. Añade una extensión:

UIApplication+rootViewController.swift

import UIKit

extension UIApplication {
    var rootViewController: UIViewController? {
        connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .flatMap { $0.windows }
            .first { $0.isKeyWindow }?
            .rootViewController
    }
}

Entonces úsalo:

guard let rootView = UIApplication.shared.rootViewController?.view else { return }
capturer = ScreenCapturer(withView: rootView)

Ruta alternativa: Capturar una región específica con UIViewRepresentable

En los siguientes pasos le mostraremos como conectar el rootView al ScreenCapturer. Sin embargo, en caso de que prefiera capturar una región específica de la pantalla - puede capturar un específico UIView respaldado por SwiftUI. Cree una UIViewRepresentable que produce la vista que desea compartir, incrustarla en su diseño y pasar su subyacente UIView al capturador (por ejemplo, a través de una devolución de llamada cuando makeUIView corre).

Ejemplo: una etiqueta de tiempo compartible:

import SwiftUI
import UIKit

struct TimeLabelView: UIViewRepresentable {
    let text: String
    private let labelTag = 1001

    func makeUIView(context: Context) -> UIView {
        let container = UIView()
        container.backgroundColor = .red

        let label = UILabel()
        label.tag = labelTag
        label.textAlignment = .center
        label.backgroundColor = .clear
        label.textColor = .white
        label.adjustsFontSizeToFitWidth = true

        label.translatesAutoresizingMaskIntoConstraints = false
        container.addSubview(label)

        NSLayoutConstraint.activate([
            label.leadingAnchor.constraint(equalTo: container.leadingAnchor),
            label.trailingAnchor.constraint(equalTo: container.trailingAnchor),
            label.topAnchor.constraint(equalTo: container.topAnchor),
            label.bottomAnchor.constraint(equalTo: container.bottomAnchor)
        ])

        return container
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        (uiView.viewWithTag(labelTag) as? UILabel)?.text = text
    }
}

Mostrar TimeLabelView en SwiftUI y cablear su UIView a su gestor (por ejemplo, a través de @State y un onAppear / Coordinator), y luego pasar esa vista a ScreenCapturer(withView:) para compartir sólo esa región en lugar de la pantalla completa.