diff --git a/JellyfinPlayer tvOS/VideoPlayer/AudioView.swift b/JellyfinPlayer tvOS/VideoPlayer/AudioView.swift index a513c98a..da404b99 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/AudioView.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/AudioView.swift @@ -9,10 +9,8 @@ import SwiftUI -class AudioViewController: UIViewController { - - var height: CGFloat = 420 - +class AudioViewController: InfoTabViewController { + override func viewDidLoad() { super.viewDidLoad() diff --git a/JellyfinPlayer tvOS/VideoPlayer/InfoTabBarViewController.swift b/JellyfinPlayer tvOS/VideoPlayer/InfoTabBarViewController.swift index f799be1a..431852c6 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/InfoTabBarViewController.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/InfoTabBarViewController.swift @@ -10,30 +10,18 @@ import TVUIKit import JellyfinAPI +class InfoTabViewController: UIViewController { + var height : CGFloat = 420 +} + + class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate { var videoPlayer: VideoPlayerViewController? var subtitleViewController: SubtitlesViewController? var audioViewController: AudioViewController? var mediaInfoController: MediaInfoViewController? - var infoContainerPos: CGRect? - var tabBarHeight: CGFloat = 0 -// override func viewWillAppear(_ animated: Bool) { -// tabBar.standardAppearance.backgroundColor = .clear -// tabBar.standardAppearance.backgroundImage = UIImage() -// tabBar.standardAppearance.backgroundEffect = .none -// tabBar.barTintColor = .clear -// for view in tabBar.subviews { -// print(view.description) -//// if view.description.contains("_UIBarBackground") { -//// -//// view.removeFromSuperview() -//// } -// } -// -// } -// override func viewDidLoad() { super.viewDidLoad() mediaInfoController = MediaInfoViewController() @@ -42,13 +30,6 @@ class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate viewControllers = [mediaInfoController!, audioViewController!, subtitleViewController!] - tabBarHeight = tabBar.frame.size.height - - tabBar.standardAppearance.backgroundColor = .clear - tabBar.standardAppearance.backgroundImage = UIImage() - tabBar.standardAppearance.backgroundEffect = .none - tabBar.barTintColor = .clear - } func setupInfoViews(mediaItem: BaseItemDto, subtitleTracks: [Subtitle], selectedSubtitleTrack: Int32, audioTracks: [AudioTrack], selectedAudioTrack: Int32, delegate: VideoPlayerSettingsDelegate) { @@ -58,52 +39,18 @@ class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate audioViewController?.prepareAudioView(audioTracks: audioTracks, selectedTrack: selectedAudioTrack, delegate: delegate) subtitleViewController?.prepareSubtitleView(subtitleTracks: subtitleTracks, selectedTrack: selectedSubtitleTrack, delegate: delegate) - - if let videoPlayer = videoPlayer { - infoContainerPos = CGRect(x: 88, y: 87, width: videoPlayer.infoViewContainer.frame.width, height: videoPlayer.infoViewContainer.frame.height) - - } - + } override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { - guard let pos = infoContainerPos else { - return - } - - switch item.title { - case "Audio": - if var height = audioViewController?.height { - height += tabBarHeight - UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in - videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height) - - } - + + if let index = tabBar.items?.firstIndex(of: item), + let tabViewController = viewControllers?[index] as? InfoTabViewController, + let width = videoPlayer?.infoPanelContainerView.frame.width { + let height = tabViewController.height + tabBar.frame.size.height + UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in + videoPlayer?.infoPanelContainerView.frame = CGRect(x: 88, y: 87, width: width, height: height) } - break - case "Info": - if var height = mediaInfoController?.height { - height += tabBarHeight - UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in - videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height) - - } - - } - break - case "Subtitles": - if var height = subtitleViewController?.height { - height += tabBarHeight - UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in - videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height) - - } - - } - break - default: - break } } diff --git a/JellyfinPlayer tvOS/VideoPlayer/MediaInfoView.swift b/JellyfinPlayer tvOS/VideoPlayer/MediaInfoView.swift index 41ba5325..6c312153 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/MediaInfoView.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/MediaInfoView.swift @@ -10,11 +10,9 @@ import SwiftUI import JellyfinAPI -class MediaInfoViewController: UIViewController { +class MediaInfoViewController: InfoTabViewController { private var contentView: UIHostingController! - var height: CGFloat = 0 - override func viewDidLoad() { super.viewDidLoad() diff --git a/JellyfinPlayer tvOS/VideoPlayer/SubtitlesView.swift b/JellyfinPlayer tvOS/VideoPlayer/SubtitlesView.swift index 4d43864d..a4e35717 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/SubtitlesView.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/SubtitlesView.swift @@ -9,9 +9,7 @@ import SwiftUI -class SubtitlesViewController: UIViewController { - - var height: CGFloat = 420 +class SubtitlesViewController: InfoTabViewController { override func viewDidLoad() { super.viewDidLoad() diff --git a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayer.storyboard b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayer.storyboard index 9f7b5970..1eac1fbd 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayer.storyboard +++ b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayer.storyboard @@ -1,9 +1,8 @@ - + - - + @@ -111,7 +110,7 @@ - + diff --git a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift index ccb50005..3f11aaeb 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift @@ -34,12 +34,9 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, @IBOutlet weak var currentTimeLabel: UILabel! @IBOutlet weak var remainingTimeLabel: UILabel! - @IBOutlet weak var infoViewContainer: UIView! + @IBOutlet weak var infoPanelContainerView: UIView! - var infoPanelDisplayPoint: CGPoint = .zero - var infoPanelHiddenPoint: CGPoint = .zero - - var containerViewController: InfoTabBarViewController? + var infoTabBarViewController: InfoTabBarViewController? var focusedOnTabBar: Bool = false var showingInfoPanel: Bool = false @@ -108,18 +105,16 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0) self.gradientView.layer.addSublayer(gradientLayer) - infoPanelDisplayPoint = infoViewContainer.center - infoPanelHiddenPoint = CGPoint(x: infoPanelDisplayPoint.x, y: -infoViewContainer.frame.height) - infoViewContainer.center = infoPanelHiddenPoint - infoViewContainer.layer.cornerRadius = 40 + infoPanelContainerView.center = CGPoint(x: infoPanelContainerView.center.x, y: -infoPanelContainerView.frame.height) + infoPanelContainerView.layer.cornerRadius = 40 let blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)) - blurEffectView.frame = infoViewContainer.bounds + blurEffectView.frame = infoPanelContainerView.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] blurEffectView.layer.cornerRadius = 40 blurEffectView.clipsToBounds = true - infoViewContainer.addSubview(blurEffectView) - infoViewContainer.sendSubviewToBack(blurEffectView) + infoPanelContainerView.addSubview(blurEffectView) + infoPanelContainerView.sendSubviewToBack(blurEffectView) transportBarView.layer.cornerRadius = CGFloat(5) @@ -351,11 +346,11 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, } - // Grabs a refference to the info panel view controller + // Grabs a reference to the info panel view controller override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "infoView" { - containerViewController = segue.destination as? InfoTabBarViewController - containerViewController?.videoPlayer = self + infoTabBarViewController = segue.destination as? InfoTabBarViewController + infoTabBarViewController?.videoPlayer = self } } @@ -398,7 +393,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, func toggleInfoContainer() { showingInfoPanel.toggle() - containerViewController?.view.isUserInteractionEnabled = showingInfoPanel + infoTabBarViewController?.view.isUserInteractionEnabled = showingInfoPanel if showingInfoPanel && seeking { scrubLabel.isHidden = true @@ -413,7 +408,10 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, } UIView.animate(withDuration: 0.4, delay: 0, options: .curveEaseOut) { [self] in - infoViewContainer.center = showingInfoPanel ? infoPanelDisplayPoint : infoPanelHiddenPoint + let size = infoPanelContainerView.frame.size + let y : CGFloat = showingInfoPanel ? 87 : -size.height + + infoPanelContainerView.frame = CGRect(x: 88, y: y, width: size.width, height: size.height) } } @@ -728,7 +726,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, } func setupInfoPanel() { - containerViewController?.setupInfoViews(mediaItem: manifest, subtitleTracks: subtitleTrackArray, selectedSubtitleTrack: selectedCaptionTrack, audioTracks: audioTrackArray, selectedAudioTrack: selectedAudioTrack, delegate: self) + infoTabBarViewController?.setupInfoViews(mediaItem: manifest, subtitleTracks: subtitleTrackArray, selectedSubtitleTrack: selectedCaptionTrack, audioTracks: audioTrackArray, selectedAudioTrack: selectedAudioTrack, delegate: self) } func formatSecondsToHMS(_ seconds: Double) -> String { diff --git a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved index b208b5a0..b5fac1e0 100644 --- a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -38,7 +38,7 @@ } }, { - "package": "jellyfin-sdk-swift", + "package": "JellyfinAPI", "repositoryURL": "https://github.com/jellyfin/jellyfin-sdk-swift", "state": { "branch": "main", @@ -47,7 +47,7 @@ } }, { - "package": "keychain-swift", + "package": "KeychainSwift", "repositoryURL": "https://github.com/evgenyneu/keychain-swift", "state": { "branch": null, @@ -83,7 +83,7 @@ } }, { - "package": "SwiftUI-Introspect", + "package": "Introspect", "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect", "state": { "branch": null,