99import Foundation
1010import SwiftUI
1111import UIKit
12+ import AccessibilitySnapshotCore
1213
1314public enum RenderingError : Error {
1415 case failedRendering( CGSize )
@@ -35,16 +36,38 @@ extension View {
3536
3637 let ( windowRootVC, containerVC) = Self . setupRootVC ( subVC: controller)
3738 window. rootViewController = windowRootVC
38- controller. expansionSettled = { [ weak containerVC, weak controller] renderingMode, precision in
39+ controller. expansionSettled = { [ weak containerVC, weak controller] renderingMode, precision, accessibilityEnabled in
3940 guard let containerVC, let controller else { return }
4041
4142 if async {
4243 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 2 ) {
43- completion ( Self . takeSnapshot ( layout: layout, renderingMode: renderingMode, rootVC: containerVC, controller : controller) , precision)
44+ completion ( Self . takeSnapshot ( layout: layout, renderingMode: renderingMode, rootVC: containerVC, targetView : controller. view ) , precision)
4445 }
4546 } else {
4647 DispatchQueue . main. async {
47- completion ( Self . takeSnapshot ( layout: layout, renderingMode: renderingMode, rootVC: containerVC, controller: controller) , precision)
48+ if let accessibilityEnabled, accessibilityEnabled {
49+ let containedView : UIView
50+ switch layout {
51+ case . device:
52+ containedView = containerVC. view
53+ default :
54+ containedView = view
55+ }
56+ let a11yView = AccessibilitySnapshotView (
57+ containedView: containedView,
58+ viewRenderingMode: renderingMode? . a11yRenderingMode ?? . drawHierarchyInRect,
59+ activationPointDisplayMode: . never,
60+ showUserInputLabels: true )
61+
62+ a11yView. center = window. center
63+ window. addSubview ( a11yView)
64+
65+ try ? a11yView. parseAccessibility ( useMonochromeSnapshot: false )
66+ a11yView. sizeToFit ( )
67+ completion ( Self . takeSnapshot ( layout: . sizeThatFits, renderingMode: renderingMode, rootVC: containerVC, targetView: a11yView) , precision)
68+ } else {
69+ completion ( Self . takeSnapshot ( layout: layout, renderingMode: renderingMode, rootVC: containerVC, targetView: view) , precision)
70+ }
4871 }
4972 }
5073 }
@@ -82,9 +105,9 @@ extension View {
82105 layout: PreviewLayout ,
83106 renderingMode: EmergeRenderingMode ? ,
84107 rootVC: UIViewController ,
85- controller : UIViewController ) -> Result < UIImage , RenderingError >
108+ targetView : UIView ) -> Result < UIImage , RenderingError >
86109 {
87- let view = controller . view!
110+ let view = targetView
88111 let drawCode : ( CGContext ) -> Void
89112
90113 CATransaction . commit ( )
@@ -142,6 +165,16 @@ extension UIView {
142165 }
143166}
144167
168+ extension EmergeRenderingMode {
169+ var a11yRenderingMode : AccessibilitySnapshotView . ViewRenderingMode {
170+ switch self {
171+ case . coreAnimation:
172+ return . renderLayerInContext
173+ case . uiView:
174+ return . drawHierarchyInRect
175+ }
176+ }
177+ }
145178
146179extension CALayer {
147180
0 commit comments