mirror of
				https://github.com/yattee/yattee.git
				synced 2025-10-30 20:22:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
| import Foundation
 | |
| import SwiftUI
 | |
| 
 | |
| struct VideoPlayerSizeModifier: ViewModifier {
 | |
|     let geometry: GeometryProxy
 | |
|     let aspectRatio: Double?
 | |
|     let fullScreen: Bool
 | |
|     var detailsHiddenInFullScreen = true
 | |
| 
 | |
|     #if os(iOS)
 | |
|         @Environment(\.verticalSizeClass) private var verticalSizeClass
 | |
|     #endif
 | |
| 
 | |
|     init(
 | |
|         geometry: GeometryProxy,
 | |
|         aspectRatio: Double? = nil,
 | |
|         fullScreen: Bool = false,
 | |
|         detailsHiddenInFullScreen: Bool = false
 | |
|     ) {
 | |
|         self.geometry = geometry
 | |
|         self.aspectRatio = aspectRatio ?? VideoPlayerView.defaultAspectRatio
 | |
|         self.fullScreen = fullScreen
 | |
|         self.detailsHiddenInFullScreen = detailsHiddenInFullScreen
 | |
|     }
 | |
| 
 | |
|     func body(content: Content) -> some View {
 | |
|         content
 | |
|             .frame(width: geometry.size.width)
 | |
|             .frame(maxHeight: maxHeight)
 | |
| 
 | |
|         #if !os(macOS)
 | |
|             .aspectRatio(ratio, contentMode: usedAspectRatioContentMode)
 | |
|         #endif
 | |
|     }
 | |
| 
 | |
|     var ratio: CGFloat? { // swiftlint:disable:this no_cgfloat
 | |
|         fullScreen ? detailsHiddenInFullScreen ? nil : usedAspectRatio : usedAspectRatio
 | |
|     }
 | |
| 
 | |
|     var usedAspectRatio: Double {
 | |
|         guard let aspectRatio, aspectRatio > 0 else {
 | |
|             return VideoPlayerView.defaultAspectRatio
 | |
|         }
 | |
| 
 | |
|         return aspectRatio
 | |
|     }
 | |
| 
 | |
|     var usedAspectRatioContentMode: ContentMode {
 | |
|         #if os(iOS)
 | |
|             fullScreen ? .fill : .fit
 | |
|         #else
 | |
|             .fit
 | |
|         #endif
 | |
|     }
 | |
| 
 | |
|     var maxHeight: Double {
 | |
|         guard !fullScreen else {
 | |
|             if detailsHiddenInFullScreen {
 | |
|                 return geometry.size.height
 | |
|             }
 | |
| 
 | |
|             return geometry.size.width / usedAspectRatio
 | |
|         }
 | |
| 
 | |
|         return max(geometry.size.height - VideoPlayerView.defaultMinimumHeightLeft, 0)
 | |
|     }
 | |
| }
 | 
