Swift

Exposer la vue de la racine pour une capture en plein écran

Pour capturer l'intégralité de l'écran de l'application, vous devez accéder à la racine. UIView. Ajouter une extension :

UIApplication+rootViewController.swift

import UIKit

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

Ensuite, utilisez :

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

Autre solution : Capturer une région spécifique avec UIViewRepresentable

Dans les étapes suivantes, nous vous montrerons comment connecter le rootView au ScreenCapturer. Cependant, si vous préférez capturer une région spécifique de l'écran, vous pouvez capturer une image spécifique de l'écran. UIView soutenu par SwiftUI. Créer un UIViewRepresentable qui produit la vue que vous souhaitez partager, intégrez-la dans votre mise en page et transmettez-lui son contenu sous-jacent UIView au capteur (par exemple, par le biais d'un rappel lorsque l'option makeUIView fonctionne).

Exemple : une étiquette temporelle à partager :

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

Affichage TimeLabelView dans SwiftUI et de câbler son UIView dans votre gestionnaire (par exemple via @State et un onAppear / Coordinator), puis transmet cette vue à ScreenCapturer(withView:) pour ne partager que cette région au lieu de l'écran complet.