import Foundation import SwiftUI struct VideoPlayerSizeModifier: ViewModifier { let geometry: GeometryProxy let aspectRatio: Double? let minimumHeightLeft: Double #if os(iOS) @Environment(\.verticalSizeClass) private var verticalSizeClass #endif init( geometry: GeometryProxy, aspectRatio: Double? = nil, minimumHeightLeft: Double? = nil ) { self.geometry = geometry self.aspectRatio = aspectRatio ?? VideoPlayerView.defaultAspectRatio self.minimumHeightLeft = minimumHeightLeft ?? VideoPlayerView.defaultMinimumHeightLeft } func body(content: Content) -> some View { content .frame(maxHeight: maxHeight) .aspectRatio(usedAspectRatio, contentMode: usedAspectRatioContentMode) .edgesIgnoringSafeArea(edgesIgnoringSafeArea) } var usedAspectRatio: Double { guard aspectRatio != nil else { return VideoPlayerView.defaultAspectRatio } let ratio = [aspectRatio!, VideoPlayerView.defaultAspectRatio].min()! let viewRatio = geometry.size.width / geometry.size.height #if os(iOS) return verticalSizeClass == .regular ? ratio : viewRatio #else return ratio #endif } var usedAspectRatioContentMode: ContentMode { #if os(iOS) verticalSizeClass == .regular ? .fit : .fill #else .fit #endif } var maxHeight: Double { #if os(iOS) let height = verticalSizeClass == .regular ? geometry.size.height - minimumHeightLeft : .infinity #else let height = geometry.size.height - minimumHeightLeft #endif return [height, 0].max()! } var edgesIgnoringSafeArea: Edge.Set { let empty = Edge.Set() #if os(iOS) return verticalSizeClass == .compact ? .all : empty #else return empty #endif } }