Swift

Freigeben der Wurzelansicht für Vollbildaufnahmen

Um den gesamten Anwendungsbildschirm zu erfassen, benötigen Sie Zugriff auf das Stammverzeichnis UIView. Fügen Sie eine Erweiterung hinzu:

UIApplication+rootViewController.swift

import UIKit

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

Dann verwenden Sie:

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

Alternativer Weg: Erfassen einer bestimmten Region mit UIViewRepresentable

In den folgenden Schritten zeigen wir Ihnen, wie Sie die rootView mit dem ScreenCapturer verbinden. Falls Sie jedoch lieber einen bestimmten Bereich des Bildschirms erfassen möchten, können Sie eine bestimmte UIView unterstützt von SwiftUI. Erstellen einer UIViewRepresentable die die Ansicht erzeugt, die Sie freigeben möchten, betten Sie sie in Ihr Layout ein und übergeben die zugrunde liegende UIView an den Erfasser (z. B. über einen Rückruf, wenn makeUIView läuft).

Beispiel - ein gemeinsam nutzbares Zeitetikett:

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

Anzeige TimeLabelView in SwiftUI und verdrahten seine UIView in Ihren Manager (z. B. über @State und ein onAppear / Coordinator), dann übergeben Sie diese Ansicht an ScreenCapturer(withView:) um nur diesen Bereich anstelle des gesamten Bildschirms freizugeben.