Swift

Exibir a visualização raiz para captura em tela cheia

Para capturar toda a tela do aplicativo, é necessário ter acesso à raiz UIView. Adicione uma extensão:

UIApplication+rootViewController.swift

import UIKit

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

Em seguida, use:

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

Método alternativo: Capturar uma região específica com UIViewRepresentable

Nas etapas a seguir, mostraremos como integrar o `rootView` ao ScreenCapturer. No entanto, caso você prefira capturar uma região específica da tela, é possível capturar uma área específica UIView com o suporte do SwiftUI. Crie um UIViewRepresentable que gera a visualização que você deseja compartilhar, incorpore-a ao seu layout e passe seu UIView para o capturador (por exemplo, por meio de um callback quando makeUIView execuções).

Exemplo — uma marca de tempo compartilhável:

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
    }
}

Exibição TimeLabelView no SwiftUI e conectar seu UIView no seu gerenciador (por exemplo, por meio de @State e um onAppear / Coordinator), e depois passar essa visualização para ScreenCapturer(withView:) para compartilhar apenas essa área, em vez da tela inteira.