From 76f0a1c66c76c1a2c654609ca9f4d020e1d15f3e Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Sun, 7 Nov 2021 18:53:00 +0100 Subject: [PATCH] Change player size based on aspect ratio --- Shared/Player/PlayerViewController.swift | 10 ++++++++++ Shared/Player/VideoPlayerSizeModifier.swift | 17 ++++++----------- Shared/Player/VideoPlayerView.swift | 6 +++--- macOS/PlayerViewController.swift | 10 ++++++++++ 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Shared/Player/PlayerViewController.swift b/Shared/Player/PlayerViewController.swift index f49144b0..0ccb35a8 100644 --- a/Shared/Player/PlayerViewController.swift +++ b/Shared/Player/PlayerViewController.swift @@ -8,6 +8,16 @@ final class PlayerViewController: UIViewController { var playerModel: PlayerModel! var playerViewController = AVPlayerViewController() + var aspectRatio: Double? { + let ratio = Double(playerViewController.videoBounds.width) / Double(playerViewController.videoBounds.height) + + if !ratio.isFinite { + return VideoPlayerView.defaultAspectRatio + } + + return [ratio, 1.0].max()! + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) diff --git a/Shared/Player/VideoPlayerSizeModifier.swift b/Shared/Player/VideoPlayerSizeModifier.swift index 07a3ad20..65bcd079 100644 --- a/Shared/Player/VideoPlayerSizeModifier.swift +++ b/Shared/Player/VideoPlayerSizeModifier.swift @@ -2,7 +2,7 @@ import Foundation import SwiftUI struct VideoPlayerSizeModifier: ViewModifier { - let geometry: GeometryProxy! + let geometry: GeometryProxy let aspectRatio: Double? let minimumHeightLeft: Double @@ -11,7 +11,7 @@ struct VideoPlayerSizeModifier: ViewModifier { #endif init( - geometry: GeometryProxy? = nil, + geometry: GeometryProxy, aspectRatio: Double? = nil, minimumHeightLeft: Double? = nil ) { @@ -21,15 +21,10 @@ struct VideoPlayerSizeModifier: ViewModifier { } func body(content: Content) -> some View { - // TODO: verify if optional GeometryProxy is still used - if geometry != nil { - content - .frame(maxHeight: maxHeight) - .aspectRatio(usedAspectRatio, contentMode: usedAspectRatioContentMode) - .edgesIgnoringSafeArea(edgesIgnoringSafeArea) - } else { - content.edgesIgnoringSafeArea(edgesIgnoringSafeArea) - } + content + .frame(maxHeight: maxHeight) + .aspectRatio(usedAspectRatio, contentMode: usedAspectRatioContentMode) + .edgesIgnoringSafeArea(edgesIgnoringSafeArea) } var usedAspectRatio: Double { diff --git a/Shared/Player/VideoPlayerView.swift b/Shared/Player/VideoPlayerView.swift index b6c62b02..44095033 100644 --- a/Shared/Player/VideoPlayerView.swift +++ b/Shared/Player/VideoPlayerView.swift @@ -67,11 +67,11 @@ struct VideoPlayerView: View { } else { #if os(macOS) Player() - .modifier(VideoPlayerSizeModifier(geometry: geometry)) + .modifier(VideoPlayerSizeModifier(geometry: geometry, aspectRatio: player.controller?.aspectRatio)) #else player.playerView - .modifier(VideoPlayerSizeModifier(geometry: geometry)) + .modifier(VideoPlayerSizeModifier(geometry: geometry, aspectRatio: player.controller?.aspectRatio)) #endif } } @@ -99,7 +99,7 @@ struct VideoPlayerView: View { #endif } .background() - .modifier(VideoDetailsPaddingModifier(geometry: geometry, fullScreen: fullScreen)) + .modifier(VideoDetailsPaddingModifier(geometry: geometry, aspectRatio: player.controller?.aspectRatio, fullScreen: fullScreen)) } #endif } diff --git a/macOS/PlayerViewController.swift b/macOS/PlayerViewController.swift index 27248c57..fdffff7d 100644 --- a/macOS/PlayerViewController.swift +++ b/macOS/PlayerViewController.swift @@ -6,6 +6,16 @@ final class PlayerViewController: NSViewController { var playerView = AVPlayerView() var pictureInPictureDelegate = PictureInPictureDelegate() + var aspectRatio: Double? { + let ratio = Double(playerView.videoBounds.width) / Double(playerView.videoBounds.height) + + if !ratio.isFinite { + return VideoPlayerView.defaultAspectRatio + } + + return [ratio, 1.0].max()! + } + override func viewDidDisappear() { super.viewDidDisappear() }