From d1071983cef6ea8c8f5e6172f390e4fc3fa04499 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sat, 2 Dec 2023 14:56:43 +0900 Subject: [PATCH 01/10] =?UTF-8?q?:recycle:=20=EC=BD=9C=EB=A0=89=EC=85=98?= =?UTF-8?q?=20=EB=B7=B0=20UI=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Playback/PlaybackViewController.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 74e270a..6083faf 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -9,6 +9,8 @@ import UIKit import AVFoundation +import OSLog + protocol PlaybackDisplayLogic: AnyObject { func displayVideoList(viewModel: PlaybackModels.LoadPlaybackVideoList.ViewModel) func displayMoveCellIfinfinite() @@ -75,7 +77,7 @@ final class PlaybackViewController: BaseViewController { do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: []) } catch { - print("Setting category to AVAudioSessionCategoryPlayback failed.") + os_log("Setting category to AVAudioSessionCategoryPlayback failed.") } } @@ -97,6 +99,7 @@ final class PlaybackViewController: BaseViewController { // MARK: - UI + Layout override func setConstraints() { + super.setConstraints() playbackCollectionView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(playbackCollectionView) NSLayoutConstraint.activate([ @@ -107,6 +110,16 @@ final class PlaybackViewController: BaseViewController { ]) } + override func setUI() { + super.setUI() + self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) + self.navigationController?.navigationBar.shadowImage = UIImage() + self.navigationController?.navigationBar.isTranslucent = true + + self.tabBarController?.tabBar.backgroundImage = UIImage() + self.tabBarController?.tabBar.shadowImage = UIImage() + self.tabBarController?.tabBar.clipsToBounds = true + } } extension PlaybackViewController: PlaybackDisplayLogic { From f40e456db4d34d2527a5e3409f9644ac88b3648c Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sat, 2 Dec 2023 16:59:10 +0900 Subject: [PATCH 02/10] =?UTF-8?q?:recycle:=20=EC=85=80=20=ED=85=94?= =?UTF-8?q?=EB=A0=88=ED=8F=AC=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Playback/Cell/PlaybackCell.swift | 8 +++----- .../Scenes/Playback/PlaybackInteractor.swift | 14 +++++++++++++- .../Scenes/Playback/PlaybackModels.swift | 14 ++++++++++++++ .../Scenes/Playback/PlaybackPresenter.swift | 6 ++++++ .../Scenes/Playback/PlaybackRouter.swift | 2 +- .../Layover/Scenes/Playback/PlaybackView.swift | 2 +- .../Playback/PlaybackViewController.swift | 17 ++++++++++------- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift index f3d4c27..5d4e84b 100644 --- a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift +++ b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift @@ -21,11 +21,9 @@ final class PlaybackCell: UICollectionViewCell { configure() } - // TODO: VideoModel 받아서 처리 - func setPlaybackContents(viewModel: PlaybackModels.PlaybackVideo) { - playbackView.descriptionView.titleLabel.text = viewModel.post.board.title - playbackView.descriptionView.setText(viewModel.post.board.description ?? "") - + func setPlaybackContents(video: Post) { + playbackView.descriptionView.titleLabel.text = video.board.title + playbackView.descriptionView.setText(video.board.description ?? "") } func addAVPlayer(url: URL) { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index 94eacd5..76602e1 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -17,6 +17,7 @@ protocol PlaybackBusinessLogic { func playInitialPlaybackCell(with request: PlaybackModels.DisplayPlaybackVideo.Request) func playVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) func playTeleportVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) + func configurePlaybackCell() } protocol PlaybackDataStore: AnyObject { @@ -63,7 +64,6 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { presenter?.presentVideoList(with: response) } - func moveInitialPlaybackCell() { let response: Models.SetInitialPlaybackCell.Response = Models.SetInitialPlaybackCell.Response(indexPathRow: index ?? 0) if parentView == .other { @@ -150,4 +150,16 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { presenter?.presentLeavePlaybackView(with: response) } + func configurePlaybackCell() { + guard let videos else { return } + guard let parentView else { return } + let response: Models.ConfigurePlaybackCell.Response + switch parentView { + case .home: + response = Models.ConfigurePlaybackCell.Response(teleportIndex: nil) + case .other: + response = Models.ConfigurePlaybackCell.Response(teleportIndex: videos.count + 1) + } + presenter?.presentConfigureCell(with: response) + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift index 9d55e50..5031d2a 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift @@ -85,4 +85,18 @@ enum PlaybackModels { } } + // MARK: - UseCase Cell Configure + + enum ConfigurePlaybackCell { + struct Request { + } + + struct Response { + let teleportIndex: Int? + } + + struct ViewModel { + let teleportIndex: Int? + } + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift index 9c27b7b..79869f9 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift @@ -19,6 +19,7 @@ protocol PlaybackPresentationLogic { func presentShowPlayerSlider(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentTeleportCell(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentLeavePlaybackView(with response: PlaybackModels.DisplayPlaybackVideo.Response) + func presentConfigureCell(with response: PlaybackModels.ConfigurePlaybackCell.Response) } final class PlaybackPresenter: PlaybackPresentationLogic { @@ -82,4 +83,9 @@ final class PlaybackPresenter: PlaybackPresentationLogic { let viewModel: Models.DisplayPlaybackVideo.ViewModel = Models.DisplayPlaybackVideo.ViewModel(prevCell: response.prevCell, curCell: nil) viewController?.leavePlaybackView(viewModel: viewModel) } + + func presentConfigureCell(with response: PlaybackModels.ConfigurePlaybackCell.Response) { + let viewModel: Models.ConfigurePlaybackCell.ViewModel = Models.ConfigurePlaybackCell.ViewModel(teleportIndex: response.teleportIndex) + viewController?.configureDataSource(viewModel: viewModel) + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackRouter.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackRouter.swift index dc43981..2100869 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackRouter.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackRouter.swift @@ -26,6 +26,6 @@ final class PlaybackRouter: NSObject, PlaybackRoutingLogic, PlaybackDataPassing // MARK: - Routing func routeToNext() { - + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift index 0dcd84e..cd5cfb3 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift @@ -183,7 +183,7 @@ private extension PlaybackView { let descriptionViewGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(descriptionViewDidTap(_:))) descriptionView.descriptionLabel.addGestureRecognizer(descriptionViewGesture) } - + // MARK: - UI Method func setDescriptionViewUI() { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 6083faf..0de4f08 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -21,6 +21,7 @@ protocol PlaybackDisplayLogic: AnyObject { func showPlayerSlider(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func teleportPlaybackCell(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func leavePlaybackView(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) + func configureDataSource(viewModel: PlaybackModels.ConfigurePlaybackCell.ViewModel) } final class PlaybackViewController: BaseViewController { @@ -70,7 +71,8 @@ final class PlaybackViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - configureDataSource() +// configureDataSource() + interactor?.configurePlaybackCell() interactor?.displayVideoList() playbackCollectionView.delegate = self playbackCollectionView.contentInsetAdjustmentBehavior = .never @@ -180,20 +182,21 @@ extension PlaybackViewController: PlaybackDisplayLogic { viewModel.prevCell?.playbackView.playerSlider.isHidden = true viewModel.prevCell?.playbackView.stopPlayer() } -} - -// MARK: - Playback Method -private extension PlaybackViewController { - func configureDataSource() { + func configureDataSource(viewModel: PlaybackModels.ConfigurePlaybackCell.ViewModel) { guard let tabbarHeight: CGFloat = self.tabBarController?.tabBar.frame.height else { return } playbackCollectionView.register(PlaybackCell.self, forCellWithReuseIdentifier: PlaybackCell.identifier) dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, video) -> UICollectionViewCell? in guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PlaybackCell.identifier, for: indexPath) as? PlaybackCell else { return PlaybackCell() } + cell.setPlaybackContents(video: video.post) + if let teleportIndex = viewModel.teleportIndex { + if indexPath.row == 0 || indexPath.row == viewModel.teleportIndex { + return cell + } + } guard let videoURL: URL = video.post.board.videoURL else { return PlaybackCell()} - cell.setPlaybackContents(viewModel: video) cell.addAVPlayer(url: videoURL) cell.setPlayerSlider(tabbarHeight: tabbarHeight) return cell From b534f19a7b580de599b8cf841da8a43cf334f7d1 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:50:12 +0900 Subject: [PATCH 03/10] =?UTF-8?q?:recycle:=20Slider=20CollectionView?= =?UTF-8?q?=EB=A1=9C=20=EB=B9=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Layover/DesignSystem/LOSlider.swift | 5 ++ .../Scenes/Playback/Cell/PlaybackCell.swift | 6 -- .../Scenes/Playback/PlaybackInteractor.swift | 6 -- .../Scenes/Playback/PlaybackPresenter.swift | 6 -- .../Scenes/Playback/PlaybackView.swift | 51 +------------- .../Playback/PlaybackViewController.swift | 66 +++++++++++++------ 6 files changed, 53 insertions(+), 87 deletions(-) diff --git a/iOS/Layover/Layover/DesignSystem/LOSlider.swift b/iOS/Layover/Layover/DesignSystem/LOSlider.swift index 6c9926d..9f10bdf 100644 --- a/iOS/Layover/Layover/DesignSystem/LOSlider.swift +++ b/iOS/Layover/Layover/DesignSystem/LOSlider.swift @@ -9,6 +9,7 @@ import UIKit final class LOSlider: UISlider { static let loSliderHeight: CGFloat = 10 + var playerView: PlayerView? override init(frame: CGRect) { super.init(frame: frame) @@ -35,4 +36,8 @@ final class LOSlider: UISlider { self.minimumValue = 0 self.maximumValue = 1 } + + func setPlayerView(_ newPlayerView: PlayerView) { + playerView = newPlayerView + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift index 5d4e84b..c14090b 100644 --- a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift +++ b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift @@ -31,11 +31,6 @@ final class PlaybackCell: UICollectionViewCell { playbackView.addAVPlayer(url: url) } - func setPlayerSlider(tabbarHeight: CGFloat) { - playbackView.setPlayerSlider() - playbackView.setPlayerSliderUI(tabbarHeight: tabbarHeight) - } - private func configure() { playbackView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(playbackView) @@ -45,6 +40,5 @@ final class PlaybackCell: UICollectionViewCell { playbackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), playbackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor) ]) - playbackView.playerSlider.isHidden = true } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index 76602e1..83908f1 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -11,7 +11,6 @@ import UIKit protocol PlaybackBusinessLogic { func displayVideoList() func moveInitialPlaybackCell() - func hidePlayerSlider() func setInitialPlaybackCell() func leavePlaybackView() func playInitialPlaybackCell(with request: PlaybackModels.DisplayPlaybackVideo.Request) @@ -94,11 +93,6 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { presenter?.presentPlayInitialPlaybackCell(with: response) } - func hidePlayerSlider() { - let response: Models.DisplayPlaybackVideo.Response = Models.DisplayPlaybackVideo.Response(prevCell: prevCell, curCell: nil) - presenter?.presentHidePlayerSlider(with: response) - } - func playVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) { guard let videos else { return } var response: Models.DisplayPlaybackVideo.Response diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift index 79869f9..3b22f1b 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift @@ -15,7 +15,6 @@ protocol PlaybackPresentationLogic { func presentSetInitialPlaybackCell(with response: PlaybackModels.SetInitialPlaybackCell.Response) func presentMoveInitialPlaybackCell(with response: PlaybackModels.SetInitialPlaybackCell.Response) func presentPlayInitialPlaybackCell(with response: PlaybackModels.DisplayPlaybackVideo.Response) - func presentHidePlayerSlider(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentShowPlayerSlider(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentTeleportCell(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentLeavePlaybackView(with response: PlaybackModels.DisplayPlaybackVideo.Response) @@ -64,11 +63,6 @@ final class PlaybackPresenter: PlaybackPresentationLogic { viewController?.stopPrevPlayerAndPlayCurPlayer(viewModel: viewModel) } - func presentHidePlayerSlider(with response: PlaybackModels.DisplayPlaybackVideo.Response) { - let viewModel: Models.DisplayPlaybackVideo.ViewModel = Models.DisplayPlaybackVideo.ViewModel(prevCell: response.prevCell, curCell: nil) - viewController?.hidePlayerSlider(viewModel: viewModel) - } - func presentShowPlayerSlider(with response: PlaybackModels.DisplayPlaybackVideo.Response) { let viewModel: Models.DisplayPlaybackVideo.ViewModel = Models.DisplayPlaybackVideo.ViewModel(prevCell: nil, curCell: response.curCell) viewController?.showPlayerSlider(viewModel: viewModel) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift index cd5cfb3..079af63 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift @@ -41,7 +41,6 @@ final class PlaybackView: UIView { button.layer.cornerRadius = 19 button.layer.borderWidth = 1 button.layer.borderColor = UIColor.layoverWhite.cgColor -// button.setImage(UIImage(systemName: "cancel"), for: .normal) button.backgroundColor = .layoverWhite return button }() @@ -78,8 +77,6 @@ final class PlaybackView: UIView { return imageView }() - let playerSlider: LOSlider = LOSlider() - let playerView: PlayerView = PlayerView() // MARK: - View Life Cycle @@ -90,7 +87,6 @@ final class PlaybackView: UIView { addDescriptionAnimateGesture() setSubViewsInPlayerViewConstraints() setPlayerView() - setPlayerSlider() } required init?(coder: NSCoder) { @@ -99,7 +95,6 @@ final class PlaybackView: UIView { addDescriptionAnimateGesture() setSubViewsInPlayerViewConstraints() setPlayerView() - setPlayerSlider() } // MARK: Player Setting Method @@ -112,32 +107,6 @@ final class PlaybackView: UIView { playerView.player?.currentItem?.status } - func setPlayerSlider() { - let interval: CMTime = CMTimeMakeWithSeconds(1, preferredTimescale: Int32(NSEC_PER_SEC)) - playerView.player?.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { [weak self] currentTime in - self?.updateSlider(currentTime: currentTime) - }) - playerSlider.addTarget(self, action: #selector(didChangedSliderValue(_:)), for: .valueChanged) - } - - func setPlayerSliderUI(tabbarHeight: CGFloat) { - let scenes = UIApplication.shared.connectedScenes - let windowScene = scenes.first as? UIWindowScene - let window = windowScene?.windows.first - guard let playerSliderWidth: CGFloat = windowScene?.screen.bounds.width else { - return - } - guard let windowHeight = (windowScene?.screen.bounds.height) else { - return - } - playerSlider.frame = CGRect(x: 0, - y: (windowHeight - tabbarHeight - LOSlider.loSliderHeight), - width: playerSliderWidth, - height: LOSlider.loSliderHeight) - window?.addSubview(playerSlider) - playerSlider.window?.windowLevel = UIWindow.Level.normal + 1 - } - // MARK: Player Play Method func stopPlayer() { @@ -161,14 +130,6 @@ final class PlaybackView: UIView { private extension PlaybackView { func updateSlider(currentTime: CMTime) { - guard let currentItem: AVPlayerItem = playerView.player?.currentItem else { - return - } - let duration: CMTime = currentItem.duration - if CMTIME_IS_INVALID(duration) { - return - } - playerSlider.value = Float(CMTimeGetSeconds(currentTime) / CMTimeGetSeconds(duration)) } // MARK: - Gesture Method @@ -255,7 +216,7 @@ private extension PlaybackView { let size = CGSize(width: LODescriptionView.descriptionWidth, height: .infinity) let estimatedSize = descriptionView.descriptionLabel.sizeThatFits(size) let totalHeight: CGFloat = estimatedSize.height + descriptionView.titleLabel.intrinsicContentSize.height - UIView.animate(withDuration: 0.3,animations: { + UIView.animate(withDuration: 0.3, animations: { self.descriptionView.titleLabel.transform = CGAffineTransform(translationX: 0, y: -(totalHeight - LODescriptionView.descriptionHeight)) self.descriptionView.descriptionLabel.transform = CGAffineTransform(translationX: 0, y: -(totalHeight - LODescriptionView.descriptionHeight)) self.gradientLayer.isHidden = true @@ -299,14 +260,4 @@ private extension PlaybackView { playerView.seek(to: CMTime.zero) playerView.play() } - - @objc func didChangedSliderValue(_ sender: LOSlider) { - guard let duration: CMTime = playerView.player?.currentItem?.duration else { - return - } - let value: Float64 = Float64(sender.value) * CMTimeGetSeconds(duration) - let seekTime: CMTime = CMTime(value: CMTimeValue(value), timescale: 1) - playerView.seek(to: seekTime) - playerView.play() - } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 0de4f08..0d25efe 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -17,7 +17,6 @@ protocol PlaybackDisplayLogic: AnyObject { func stopPrevPlayerAndPlayCurPlayer(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func setInitialPlaybackCell(viewModel: PlaybackModels.SetInitialPlaybackCell.ViewModel) func moveInitialPlaybackCell(viewModel: PlaybackModels.SetInitialPlaybackCell.ViewModel) - func hidePlayerSlider(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func showPlayerSlider(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func teleportPlaybackCell(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func leavePlaybackView(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) @@ -42,6 +41,7 @@ final class PlaybackViewController: BaseViewController { }() // MARK: - Properties + private var playerSlider: LOSlider = LOSlider() private var dataSource: UICollectionViewDiffableDataSource? @@ -71,7 +71,6 @@ final class PlaybackViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() -// configureDataSource() interactor?.configurePlaybackCell() interactor?.displayVideoList() playbackCollectionView.delegate = self @@ -121,6 +120,42 @@ final class PlaybackViewController: BaseViewController { self.tabBarController?.tabBar.backgroundImage = UIImage() self.tabBarController?.tabBar.shadowImage = UIImage() self.tabBarController?.tabBar.clipsToBounds = true + + let scenes = UIApplication.shared.connectedScenes + let windowScene = scenes.first as? UIWindowScene + let window = windowScene?.windows.first + guard let playerSliderWidth: CGFloat = windowScene?.screen.bounds.width else { return } + guard let windowHeight: CGFloat = windowScene?.screen.bounds.height else { return } + guard let tabBarHeight: CGFloat = self.tabBarController?.tabBar.frame.height else { + return + } + playerSlider.frame = CGRect(x: 0, y: (windowHeight - tabBarHeight), width: playerSliderWidth, height: LOSlider.loSliderHeight) + window?.addSubview(playerSlider) + playerSlider.window?.windowLevel = UIWindow.Level.normal + 1 + } + + private func setPlayerSlider(at playbackView: PlaybackView) { + let interval: CMTime = CMTimeMakeWithSeconds(1, preferredTimescale: Int32(NSEC_PER_SEC)) + playbackView.playerView.player?.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { [weak self] currentTime in + self?.updateSlider(currentTime: currentTime, playerView: playbackView.playerView) + }) + playerSlider.playerView = playbackView.playerView + playerSlider.addTarget(self, action: #selector(didChangedSliderValue(_:)), for: .valueChanged) + } + + private func updateSlider(currentTime: CMTime, playerView: PlayerView) { + guard let currentItem: AVPlayerItem = playerView.player?.currentItem else { return } + let duration: CMTime = currentItem.duration + if CMTIME_IS_INVALID(duration) { return } + playerSlider.value = Float(CMTimeGetSeconds(currentTime) / CMTimeGetSeconds(duration)) + } + + @objc private func didChangedSliderValue(_ sender: LOSlider) { + guard let duration: CMTime = sender.playerView?.player?.currentItem?.duration else { return } + let value: Float64 = Float64(sender.value) * CMTimeGetSeconds(duration) + let seekTime: CMTime = CMTime(value: CMTimeValue(value), timescale: 1) + sender.playerView?.seek(to: seekTime) + sender.playerView?.play() } } @@ -143,7 +178,11 @@ extension PlaybackViewController: PlaybackDisplayLogic { } if let curCell = viewModel.curCell { curCell.playbackView.playPlayer() - curCell.playbackView.playerSlider.isHidden = false + setPlayerSlider(at: curCell.playbackView) + // Slider가 원점으로 돌아가는 시간 필요 + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { + self.playerSlider.isHidden = false + } } } @@ -155,16 +194,8 @@ extension PlaybackViewController: PlaybackDisplayLogic { interactor?.playInitialPlaybackCell(with: request) } - func hidePlayerSlider(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) { - if let prevCell = viewModel.prevCell { - prevCell.playbackView.playerSlider.isHidden = true - } - } - func showPlayerSlider(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) { - if let curCell = viewModel.curCell { - curCell.playbackView.playerSlider.isHidden = false - } + playerSlider.isHidden = false } func moveInitialPlaybackCell(viewModel: PlaybackModels.SetInitialPlaybackCell.ViewModel) { @@ -179,26 +210,23 @@ extension PlaybackViewController: PlaybackDisplayLogic { } func leavePlaybackView(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) { - viewModel.prevCell?.playbackView.playerSlider.isHidden = true + playerSlider.isHidden = true viewModel.prevCell?.playbackView.stopPlayer() } func configureDataSource(viewModel: PlaybackModels.ConfigurePlaybackCell.ViewModel) { - guard let tabbarHeight: CGFloat = self.tabBarController?.tabBar.frame.height else { - return - } playbackCollectionView.register(PlaybackCell.self, forCellWithReuseIdentifier: PlaybackCell.identifier) dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, video) -> UICollectionViewCell? in guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PlaybackCell.identifier, for: indexPath) as? PlaybackCell else { return PlaybackCell() } cell.setPlaybackContents(video: video.post) if let teleportIndex = viewModel.teleportIndex { - if indexPath.row == 0 || indexPath.row == viewModel.teleportIndex { + if indexPath.row == 0 || indexPath.row == teleportIndex { return cell } } guard let videoURL: URL = video.post.board.videoURL else { return PlaybackCell()} cell.addAVPlayer(url: videoURL) - cell.setPlayerSlider(tabbarHeight: tabbarHeight) + self.setPlayerSlider(at: cell.playbackView) return cell } } @@ -233,7 +261,7 @@ extension PlaybackViewController: UICollectionViewDelegate { } func scrollViewDidScroll(_ scrollView: UIScrollView) { - interactor?.hidePlayerSlider() + playerSlider.isHidden = true } func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { From 17043521b57d5ef14a76a6323069630ab746c849 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:40:29 +0900 Subject: [PATCH 04/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Playback/PlaybackViewController.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 0d25efe..9e081b5 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -113,13 +113,13 @@ final class PlaybackViewController: BaseViewController { override func setUI() { super.setUI() - self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) - self.navigationController?.navigationBar.shadowImage = UIImage() - self.navigationController?.navigationBar.isTranslucent = true + let navigationBarAppearance: UINavigationBarAppearance = UINavigationBarAppearance() + navigationBarAppearance.configureWithTransparentBackground() + self.navigationController?.navigationBar.standardAppearance = navigationBarAppearance - self.tabBarController?.tabBar.backgroundImage = UIImage() - self.tabBarController?.tabBar.shadowImage = UIImage() - self.tabBarController?.tabBar.clipsToBounds = true + let tabBarAppearance: UITabBarAppearance = UITabBarAppearance() + tabBarAppearance.configureWithTransparentBackground() + self.tabBarController?.tabBar.standardAppearance = tabBarAppearance let scenes = UIApplication.shared.connectedScenes let windowScene = scenes.first as? UIWindowScene From 07133dd245a3a6518d86a4e48521e911ca3fe3cf Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:11:44 +0900 Subject: [PATCH 05/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81:=20PlayerView=20=EB=B9=BC?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Layover/DesignSystem/LOSlider.swift | 5 ----- .../Scenes/Playback/PlaybackInteractor.swift | 8 ++++++++ .../Scenes/Playback/PlaybackModels.swift | 18 ++++++++++++++++++ .../Scenes/Playback/PlaybackPresenter.swift | 6 ++++++ .../Layover/Scenes/Playback/PlaybackView.swift | 8 ++++++++ .../Playback/PlaybackViewController.swift | 15 +++++++++------ 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/iOS/Layover/Layover/DesignSystem/LOSlider.swift b/iOS/Layover/Layover/DesignSystem/LOSlider.swift index 9f10bdf..6c9926d 100644 --- a/iOS/Layover/Layover/DesignSystem/LOSlider.swift +++ b/iOS/Layover/Layover/DesignSystem/LOSlider.swift @@ -9,7 +9,6 @@ import UIKit final class LOSlider: UISlider { static let loSliderHeight: CGFloat = 10 - var playerView: PlayerView? override init(frame: CGRect) { super.init(frame: frame) @@ -36,8 +35,4 @@ final class LOSlider: UISlider { self.minimumValue = 0 self.maximumValue = 1 } - - func setPlayerView(_ newPlayerView: PlayerView) { - playerView = newPlayerView - } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index 83908f1..8bb327e 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -17,6 +17,7 @@ protocol PlaybackBusinessLogic { func playVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) func playTeleportVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) func configurePlaybackCell() + func controlPlaybackMovie(with request: PlaybackModels.SeekVideo.Request) } protocol PlaybackDataStore: AnyObject { @@ -156,4 +157,11 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } presenter?.presentConfigureCell(with: response) } + + func controlPlaybackMovie(with request: PlaybackModels.SeekVideo.Request) { + guard let prevCell else { return } + let willMoveLocation: Float64 = request.currentLocation * prevCell.playbackView.getDuration() + let response: Models.SeekVideo.Response = Models.SeekVideo.Response(willMoveLocation: willMoveLocation, curCell: prevCell) + presenter?.presentSeekVideo(with: response) + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift index 5031d2a..9932879 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift @@ -99,4 +99,22 @@ enum PlaybackModels { let teleportIndex: Int? } } + + // MARK: - UseCase Seek Video + + enum SeekVideo { + struct Request { + let currentLocation: Float64 + } + + struct Response { + let willMoveLocation: Float64 + let curCell: PlaybackCell + } + + struct ViewModel { + let willMoveLocation: Float64 + let curCell: PlaybackCell + } + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift index 3b22f1b..7e4179d 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift @@ -19,6 +19,7 @@ protocol PlaybackPresentationLogic { func presentTeleportCell(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentLeavePlaybackView(with response: PlaybackModels.DisplayPlaybackVideo.Response) func presentConfigureCell(with response: PlaybackModels.ConfigurePlaybackCell.Response) + func presentSeekVideo(with response: PlaybackModels.SeekVideo.Response) } final class PlaybackPresenter: PlaybackPresentationLogic { @@ -82,4 +83,9 @@ final class PlaybackPresenter: PlaybackPresentationLogic { let viewModel: Models.ConfigurePlaybackCell.ViewModel = Models.ConfigurePlaybackCell.ViewModel(teleportIndex: response.teleportIndex) viewController?.configureDataSource(viewModel: viewModel) } + + func presentSeekVideo(with response: PlaybackModels.SeekVideo.Response) { + let viewModel: Models.SeekVideo.ViewModel = Models.SeekVideo.ViewModel(willMoveLocation: response.willMoveLocation, curCell: response.curCell) + viewController?.seekVideo(viewModel: viewModel) + } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift index c394e44..bf4fcbf 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift @@ -124,6 +124,14 @@ final class PlaybackView: UIView { func resetPlayer() { playerView.resetPlayer() } + + func seekPlayer(seekTime: CMTime) { + playerView.seek(to: seekTime) + } + + func getDuration() -> Float64 { + CMTimeGetSeconds(playerView.player?.currentItem?.duration ?? CMTime(value: 0, timescale: 1)) + } } // MARK: PlaybackView 내부에서만 쓰이는 Method diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 9e081b5..00f67d5 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -21,6 +21,7 @@ protocol PlaybackDisplayLogic: AnyObject { func teleportPlaybackCell(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func leavePlaybackView(viewModel: PlaybackModels.DisplayPlaybackVideo.ViewModel) func configureDataSource(viewModel: PlaybackModels.ConfigurePlaybackCell.ViewModel) + func seekVideo(viewModel: PlaybackModels.SeekVideo.ViewModel) } final class PlaybackViewController: BaseViewController { @@ -139,7 +140,6 @@ final class PlaybackViewController: BaseViewController { playbackView.playerView.player?.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { [weak self] currentTime in self?.updateSlider(currentTime: currentTime, playerView: playbackView.playerView) }) - playerSlider.playerView = playbackView.playerView playerSlider.addTarget(self, action: #selector(didChangedSliderValue(_:)), for: .valueChanged) } @@ -151,11 +151,8 @@ final class PlaybackViewController: BaseViewController { } @objc private func didChangedSliderValue(_ sender: LOSlider) { - guard let duration: CMTime = sender.playerView?.player?.currentItem?.duration else { return } - let value: Float64 = Float64(sender.value) * CMTimeGetSeconds(duration) - let seekTime: CMTime = CMTime(value: CMTimeValue(value), timescale: 1) - sender.playerView?.seek(to: seekTime) - sender.playerView?.play() + let request: Models.SeekVideo.Request = Models.SeekVideo.Request(currentLocation: Float64(sender.value)) + interactor?.controlPlaybackMovie(with: request) } } @@ -230,6 +227,12 @@ extension PlaybackViewController: PlaybackDisplayLogic { return cell } } + + func seekVideo(viewModel: PlaybackModels.SeekVideo.ViewModel) { + let seekTime: CMTime = CMTime(value: CMTimeValue(viewModel.willMoveLocation), timescale: 1) + viewModel.curCell.playbackView.seekPlayer(seekTime: seekTime) + viewModel.curCell.playbackView.playPlayer() + } } extension PlaybackViewController: UICollectionViewDelegateFlowLayout { From 9f90873ffc861bdc700d06fd70d6d869eb8daffd Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:20:05 +0900 Subject: [PATCH 06/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scrollDid -> willbegindragging --- .../Layover/Scenes/Playback/PlaybackViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 00f67d5..1e98e09 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -263,7 +263,7 @@ extension PlaybackViewController: UICollectionViewDelegate { interactor?.playVideo(with: request) } - func scrollViewDidScroll(_ scrollView: UIScrollView) { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { playerSlider.isHidden = true } From ac10ea0c48302570f4548dca136c571ca30cb7f4 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:40:34 +0900 Subject: [PATCH 07/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81:=20Set=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Playback/PlaybackViewController.swift | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 1e98e09..c1570a6 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -114,14 +114,10 @@ final class PlaybackViewController: BaseViewController { override func setUI() { super.setUI() - let navigationBarAppearance: UINavigationBarAppearance = UINavigationBarAppearance() - navigationBarAppearance.configureWithTransparentBackground() - self.navigationController?.navigationBar.standardAppearance = navigationBarAppearance - - let tabBarAppearance: UITabBarAppearance = UITabBarAppearance() - tabBarAppearance.configureWithTransparentBackground() - self.tabBarController?.tabBar.standardAppearance = tabBarAppearance + addWindowPlayerSlider() + } + private func addWindowPlayerSlider() { let scenes = UIApplication.shared.connectedScenes let windowScene = scenes.first as? UIWindowScene let window = windowScene?.windows.first From cf5ede7cd562db3310c9c931fccf4f8eb74ecfd0 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Mon, 4 Dec 2023 02:30:03 +0900 Subject: [PATCH 08/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81:=20VIP=20Cycle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit \ --- iOS/Layover/Layover/Models/Board.swift | 2 +- iOS/Layover/Layover/Models/Member.swift | 2 +- iOS/Layover/Layover/Models/Post.swift | 2 +- .../Network/Mock/MockData/PostList.json | 2 +- .../Layover/Scenes/Home/HomeInteractor.swift | 1 + .../Layover/Scenes/Home/HomeRouter.swift | 7 +--- .../Layover/Scenes/Map/MapInteractor.swift | 8 ++--- .../Layover/Scenes/Map/MapRouter.swift | 9 +---- .../Scenes/Playback/Cell/PlaybackCell.swift | 10 ++++-- .../Scenes/Playback/PlaybackInteractor.swift | 34 ++++++++----------- .../Scenes/Playback/PlaybackModels.swift | 19 +++++++++-- .../Scenes/Playback/PlaybackPresenter.swift | 16 ++++++++- .../Scenes/Playback/PlaybackView.swift | 4 +-- .../Playback/PlaybackViewController.swift | 9 +++-- .../Scenes/Playback/PlaybackWorker.swift | 10 +++--- 15 files changed, 75 insertions(+), 60 deletions(-) diff --git a/iOS/Layover/Layover/Models/Board.swift b/iOS/Layover/Layover/Models/Board.swift index e492aed..9570e71 100644 --- a/iOS/Layover/Layover/Models/Board.swift +++ b/iOS/Layover/Layover/Models/Board.swift @@ -8,7 +8,7 @@ import Foundation -struct Board: Hashable { +struct Board { let identifier: Int let title: String let description: String? diff --git a/iOS/Layover/Layover/Models/Member.swift b/iOS/Layover/Layover/Models/Member.swift index 2e67123..f165fdf 100644 --- a/iOS/Layover/Layover/Models/Member.swift +++ b/iOS/Layover/Layover/Models/Member.swift @@ -8,7 +8,7 @@ import Foundation -struct Member: Hashable { +struct Member { let identifier: Int let username: String let introduce: String diff --git a/iOS/Layover/Layover/Models/Post.swift b/iOS/Layover/Layover/Models/Post.swift index 636226e..24b658c 100644 --- a/iOS/Layover/Layover/Models/Post.swift +++ b/iOS/Layover/Layover/Models/Post.swift @@ -8,7 +8,7 @@ import Foundation -struct Post: Hashable { +struct Post { let member: Member let board: Board let tag: [String] diff --git a/iOS/Layover/Layover/Network/Mock/MockData/PostList.json b/iOS/Layover/Layover/Network/Mock/MockData/PostList.json index 4553b67..490b7cc 100644 --- a/iOS/Layover/Layover/Network/Mock/MockData/PostList.json +++ b/iOS/Layover/Layover/Network/Mock/MockData/PostList.json @@ -30,7 +30,7 @@ }, "board" : { "id" : 2, - "url" : "https://playertest.longtailvideo.com/adaptive/wowzaid3/playlist.m3u8", + "url" : "https://qc66zhsq1708.edge.naverncp.com/hls/fMG98EEU8c1UirV-awtm4qKJyhaHRcnDymRFlPLZbTs_/layover-station/IMG_0136_AVC_,HD,SD,_1Pass_30fps.mp4.smil/master.m3u8", "video_thumbnail" : "video_thumbnail_link", "longitude" : "37.0532156213", "latitude" : "127.060123123", diff --git a/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift b/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift index fefd538..a1aa7c8 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeInteractor.swift @@ -51,6 +51,7 @@ extension HomeInteractor: HomeBusinessLogic { let response = Models.FetchPosts.Response(posts: posts) await MainActor.run { + self.posts = posts presenter?.presentPosts(with: response) } } diff --git a/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift b/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift index 73e5053..eed5498 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeRouter.swift @@ -39,7 +39,7 @@ final class HomeRouter: NSObject, HomeRoutingLogic, HomeDataPassing { else { return } destination.parentView = .home destination.index = source.postPlayStartIndex - destination.videos = transData(videos: source.posts ?? []) + destination.posts = source.posts viewController?.navigationController?.pushViewController(playbackViewController, animated: true) } func routeToEditVideo() { @@ -55,11 +55,6 @@ final class HomeRouter: NSObject, HomeRoutingLogic, HomeDataPassing { viewController?.navigationController?.pushViewController(nextViewController, animated: true) } - private func transData(videos: [Post]) -> [PlaybackModels.PlaybackVideo] { - videos.map { video in - return PlaybackModels.PlaybackVideo(post: video) - } - } // MARK: - Data Passing // func passDataTo(_ destinationDS: inout NextDataStore, from sourceDS: HomeDataStore) { diff --git a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift index 5ddf928..928496d 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift @@ -16,7 +16,7 @@ protocol MapBusinessLogic { } protocol MapDataStore { - var videos: [Post]? { get set } + var posts: [Post]? { get set } var index: Int? { get set } } @@ -34,8 +34,8 @@ final class MapInteractor: NSObject, MapBusinessLogic, MapDataStore { var index: Int? - var videos: [Post]? - + var posts: [Post]? + var presenter: MapPresentationLogic? override init() { @@ -60,7 +60,7 @@ final class MapInteractor: NSObject, MapBusinessLogic, MapDataStore { } func moveToPlaybackScene(with request: Models.MoveToPlaybackScene.Request) { - videos = request.videos + posts = request.videos index = request.index presenter?.presentPlaybackScene() } diff --git a/iOS/Layover/Layover/Scenes/Map/MapRouter.swift b/iOS/Layover/Layover/Scenes/Map/MapRouter.swift index 40549bd..a478afb 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapRouter.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapRouter.swift @@ -32,14 +32,7 @@ final class MapRouter: MapRoutingLogic, MapDataPassing { else { return } destination.parentView = .other destination.index = source.index - destination.videos = transData(videos: source.videos ?? []) + destination.posts = source.posts viewController?.navigationController?.pushViewController(playbackViewController, animated: true) } - - private func transData(videos: [Post]) -> [PlaybackModels.PlaybackVideo] { - videos.map { video in - return PlaybackModels.PlaybackVideo(post: video) - } - } - } diff --git a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift index c14090b..72d2239 100644 --- a/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift +++ b/iOS/Layover/Layover/Scenes/Playback/Cell/PlaybackCell.swift @@ -21,9 +21,13 @@ final class PlaybackCell: UICollectionViewCell { configure() } - func setPlaybackContents(video: Post) { - playbackView.descriptionView.titleLabel.text = video.board.title - playbackView.descriptionView.setText(video.board.description ?? "") + func setPlaybackContents(info: PlaybackModels.PlaybackInfo) { + playbackView.descriptionView.titleLabel.text = info.title + playbackView.descriptionView.setText(info.content) + playbackView.profileLabel.text = info.profileName + info.tag.forEach { tag in + playbackView.tagStackView.addTag(tag) + } } func addAVPlayer(url: URL) { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index 8bb327e..929d09a 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -21,11 +21,11 @@ protocol PlaybackBusinessLogic { } protocol PlaybackDataStore: AnyObject { - var videos: [PlaybackModels.PlaybackVideo]? { get set } var parentView: PlaybackModels.ParentView? { get set } var prevCell: PlaybackCell? { get set } var index: Int? { get set } var isTeleport: Bool? { get set } + var posts: [Post]? { get set } } final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { @@ -37,8 +37,6 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { lazy var worker = PlaybackWorker() var presenter: PlaybackPresentationLogic? - var videos: [PlaybackModels.PlaybackVideo]? - var parentView: Models.ParentView? var prevCell: PlaybackCell? @@ -47,20 +45,18 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { var isTeleport: Bool? + var posts: [Post]? + // MARK: - UseCase Load Video List func displayVideoList() { - guard let parentView: Models.ParentView else { - return - } - guard var videos: [PlaybackModels.PlaybackVideo] else { - return - } + guard let parentView: Models.ParentView else { return } + guard var posts: [Post] else { return } if parentView == .other { - videos = worker.makeInfiniteScroll(videos: videos) - self.videos = videos + posts = worker.makeInfiniteScroll(posts: posts) + self.posts = posts } - let response: Models.LoadPlaybackVideoList.Response = Models.LoadPlaybackVideoList.Response(videos: videos) + let response: Models.LoadPlaybackVideoList.Response = Models.LoadPlaybackVideoList.Response(posts: posts) presenter?.presentVideoList(with: response) } @@ -95,7 +91,7 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } func playVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) { - guard let videos else { return } + guard let posts else { return } var response: Models.DisplayPlaybackVideo.Response if prevCell == request.curCell { response = Models.DisplayPlaybackVideo.Response(prevCell: nil, curCell: prevCell) @@ -105,10 +101,10 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } // Home이 아닌 다른 뷰에서 왔을 경우(로드한 목록 무한 반복) if parentView == .other { - if request.indexPathRow == (videos.count - 1) { + if request.indexPathRow == (posts.count - 1) { response = Models.DisplayPlaybackVideo.Response(indexPathRow: 1, prevCell: prevCell, curCell: nil) } else if request.indexPathRow == 0 { - response = Models.DisplayPlaybackVideo.Response(indexPathRow: videos.count - 2, prevCell: prevCell, curCell: nil) + response = Models.DisplayPlaybackVideo.Response(indexPathRow: posts.count - 2, prevCell: prevCell, curCell: nil) } else { response = Models.DisplayPlaybackVideo.Response(prevCell: prevCell, curCell: request.curCell) prevCell = request.curCell @@ -129,9 +125,9 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { func playTeleportVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) { guard let isTeleport else { return } - guard let videos else { return } + guard let posts else { return } if isTeleport { - if request.indexPathRow == 1 || request.indexPathRow == (videos.count - 2) { + if request.indexPathRow == 1 || request.indexPathRow == (posts.count - 2) { let response: Models.DisplayPlaybackVideo.Response = Models.DisplayPlaybackVideo.Response(prevCell: prevCell, curCell: request.curCell) prevCell = request.curCell presenter?.presentMoveCellNext(with: response) @@ -146,14 +142,14 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } func configurePlaybackCell() { - guard let videos else { return } + guard let posts else { return } guard let parentView else { return } let response: Models.ConfigurePlaybackCell.Response switch parentView { case .home: response = Models.ConfigurePlaybackCell.Response(teleportIndex: nil) case .other: - response = Models.ConfigurePlaybackCell.Response(teleportIndex: videos.count + 1) + response = Models.ConfigurePlaybackCell.Response(teleportIndex: posts.count + 1) } presenter?.presentConfigureCell(with: response) } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift index 9932879..d68714c 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift @@ -12,7 +12,7 @@ enum PlaybackModels { // MARK: - Properties Type struct PlaybackVideo: Hashable { var id: UUID = UUID() - let post: Post + let playbackInfo: PlaybackInfo } enum ParentView { @@ -20,6 +20,21 @@ enum PlaybackModels { case other } + struct PlaybackInfo: Hashable { + let title: String + let content: String + let profileImageURL: URL? + let profileName: String + let tag: [String] + // location + let videoURL: URL + } + + struct PlaybackViewInfo { + let parentView: ParentView + let videos: [PlaybackVideo] + } + // MARK: - UseCase Load Video List enum LoadPlaybackVideoList { @@ -28,7 +43,7 @@ enum PlaybackModels { } struct Response { - let videos: [PlaybackVideo] + let posts: [Post] } struct ViewModel { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift index 7e4179d..f8a68ea 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackPresenter.swift @@ -29,10 +29,24 @@ final class PlaybackPresenter: PlaybackPresentationLogic { typealias Models = PlaybackModels weak var viewController: PlaybackDisplayLogic? + private func transPostToVideo(_ posts: [Post]) -> [Models.PlaybackVideo] { + posts.compactMap { post in + guard let videoURL: URL = post.board.videoURL else { + return nil + } + return Models.PlaybackVideo(playbackInfo: PlaybackModels.PlaybackInfo( + title: post.board.title, + content: post.board.description ?? "", + profileImageURL: post.member.profileImageURL, + profileName: post.member.username, + tag: post.tag, + videoURL: videoURL)) + } + } // MARK: - UseCase Load Video List func presentVideoList(with response: PlaybackModels.LoadPlaybackVideoList.Response) { - let viewModel: Models.LoadPlaybackVideoList.ViewModel = Models.LoadPlaybackVideoList.ViewModel(videos: response.videos) + let viewModel: Models.LoadPlaybackVideoList.ViewModel = Models.LoadPlaybackVideoList.ViewModel(videos: transPostToVideo(response.posts)) viewController?.displayVideoList(viewModel: viewModel) } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift index bf4fcbf..b789855 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackView.swift @@ -31,7 +31,7 @@ final class PlaybackView: UIView { return gradientLayer }() - private let tagStackView: LOTagStackView = { + let tagStackView: LOTagStackView = { let tagStackView: LOTagStackView = LOTagStackView(style: .basic) return tagStackView }() @@ -45,7 +45,7 @@ final class PlaybackView: UIView { return button }() - private let profileLabel: UILabel = { + let profileLabel: UILabel = { let label: UILabel = UILabel() label.font = .loFont(type: .body2Bold) label.textColor = UIColor.layoverWhite diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index c1570a6..8f9e202 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -126,7 +126,7 @@ final class PlaybackViewController: BaseViewController { guard let tabBarHeight: CGFloat = self.tabBarController?.tabBar.frame.height else { return } - playerSlider.frame = CGRect(x: 0, y: (windowHeight - tabBarHeight), width: playerSliderWidth, height: LOSlider.loSliderHeight) + playerSlider.frame = CGRect(x: 0, y: (windowHeight - tabBarHeight - LOSlider.loSliderHeight / 2), width: playerSliderWidth, height: LOSlider.loSliderHeight) window?.addSubview(playerSlider) playerSlider.window?.windowLevel = UIWindow.Level.normal + 1 } @@ -209,16 +209,15 @@ extension PlaybackViewController: PlaybackDisplayLogic { func configureDataSource(viewModel: PlaybackModels.ConfigurePlaybackCell.ViewModel) { playbackCollectionView.register(PlaybackCell.self, forCellWithReuseIdentifier: PlaybackCell.identifier) - dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, video) -> UICollectionViewCell? in + dataSource = UICollectionViewDiffableDataSource(collectionView: playbackCollectionView) { (collectionView, indexPath, playbackVideo) -> UICollectionViewCell? in guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PlaybackCell.identifier, for: indexPath) as? PlaybackCell else { return PlaybackCell() } - cell.setPlaybackContents(video: video.post) + cell.setPlaybackContents(info: playbackVideo.playbackInfo) if let teleportIndex = viewModel.teleportIndex { if indexPath.row == 0 || indexPath.row == teleportIndex { return cell } } - guard let videoURL: URL = video.post.board.videoURL else { return PlaybackCell()} - cell.addAVPlayer(url: videoURL) + cell.addAVPlayer(url: playbackVideo.playbackInfo.videoURL) self.setPlayerSlider(at: cell.playbackView) return cell } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift index 62ab097..ebccd27 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift @@ -16,12 +16,10 @@ final class PlaybackWorker { // MARK: - Methods - func makeInfiniteScroll(videos: [Models.PlaybackVideo]) -> [Models.PlaybackVideo] { - var tempVideos: [Models.PlaybackVideo] = videos - var tempLastVideo: Models.PlaybackVideo = videos[tempVideos.count-1] - tempLastVideo.id = UUID() - var tempFirstVideo: Models.PlaybackVideo = videos[1] - tempFirstVideo.id = UUID() + func makeInfiniteScroll(posts: [Post]) -> [Post] { + var tempVideos: [Post] = posts + var tempLastVideo: Post = posts[tempVideos.count-1] + var tempFirstVideo: Post = posts[1] tempVideos.insert(tempLastVideo, at: 0) tempVideos.append(tempFirstVideo) return tempVideos From 230f8e9b05a6d5b9e781617df0fcf6633bfb7139 Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Mon, 4 Dec 2023 02:44:18 +0900 Subject: [PATCH 09/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=A7=B5=EB=B7=B0=EC=97=90=EC=84=9C=EB=8F=84=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Layover/Scenes/Map/MapInteractor.swift | 11 +++- .../Layover/Scenes/Map/MapModels.swift | 11 ++++ .../Scenes/Map/MapViewController.swift | 65 ++----------------- .../Views/MapCarouselCollectionViewCell.swift | 12 ---- 4 files changed, 28 insertions(+), 71 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift index 928496d..052ac3b 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapInteractor.swift @@ -13,9 +13,11 @@ protocol MapBusinessLogic { func checkLocationAuthorizationStatus() func fetchVideos() func moveToPlaybackScene(with: MapModels.MoveToPlaybackScene.Request) + func playPosts(with: MapModels.PlayPosts.Request) } -protocol MapDataStore { +protocol MapDataStore { + var postPlayStartIndex: Int? { get set } var posts: [Post]? { get set } var index: Int? { get set } } @@ -36,6 +38,8 @@ final class MapInteractor: NSObject, MapBusinessLogic, MapDataStore { var posts: [Post]? + var postPlayStartIndex: Int? + var presenter: MapPresentationLogic? override init() { @@ -65,6 +69,11 @@ final class MapInteractor: NSObject, MapBusinessLogic, MapDataStore { presenter?.presentPlaybackScene() } + func playPosts(with request: MapModels.PlayPosts.Request) { + postPlayStartIndex = request.selectedIndex + presenter?.presentPlaybackScene() + } + private func checkCurrentLocationAuthorization(for status: CLAuthorizationStatus) { switch status { case .authorizedAlways, .authorizedWhenInUse: diff --git a/iOS/Layover/Layover/Scenes/Map/MapModels.swift b/iOS/Layover/Layover/Scenes/Map/MapModels.swift index b5b6ad4..8de8dea 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapModels.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapModels.swift @@ -50,4 +50,15 @@ enum MapModels { } } + enum PlayPosts { + struct Request { + let selectedIndex: Int + } + + struct Response { + } + + struct ViewModel { + } + } } diff --git a/iOS/Layover/Layover/Scenes/Map/MapViewController.swift b/iOS/Layover/Layover/Scenes/Map/MapViewController.swift index 0e401f2..29e8669 100644 --- a/iOS/Layover/Layover/Scenes/Map/MapViewController.swift +++ b/iOS/Layover/Layover/Scenes/Map/MapViewController.swift @@ -62,64 +62,6 @@ final class MapViewController: BaseViewController { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MapCarouselCollectionViewCell.identifier, for: indexPath) as? MapCarouselCollectionViewCell else { return UICollectionViewCell() } cell.configure(url: item.videoURL) - cell.moveToPlaybackSceneCallback = { - self.interactor?.moveToPlaybackScene( - with: Models.MoveToPlaybackScene.Request( - index: indexPath.row, - videos: [ - Post( - member: Member( - identifier: 1, - username: "찹모찌", - introduce: "찹모찌데스", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - board: Board( - identifier: 1, - title: "찹찹찹", - description: "찹모찌의 뜻은 뭘까?", - thumbnailImageURL: nil, - videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - latitude: nil, - longitude: nil), - tag: ["찹", "모", "찌"] - ), - Post( - member: Member( - identifier: 2, - username: "로인설", - introduce: "로인설데스", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - board: Board( - identifier: 2, - title: "설설설", - description: "로인설의 뜻은 뭘까?", - thumbnailImageURL: nil, - videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - latitude: nil, - longitude: nil), - tag: ["로", "인", "설"] - ), - Post( - member: Member( - identifier: 3, - username: "콩콩콩", - introduce: "콩콩콩데스", - profileImageURL: URL(string: "https://i.ibb.co/qML8vdN/2023-11-25-9-08-01.png")!), - board: Board( - identifier: 1, - title: "콩콩콩", - description: "콩콩콩의 뜻은 뭘까?", - thumbnailImageURL: nil, - videoURL: URL(string: "https://bitmovin-a.akamaihd.net/content/art-of-motion_drm/m3u8s/11331.m3u8")!, - latitude: nil, - longitude: nil), - tag: ["콩", "콩", "콩"] - ) - ] - ) - ) - } - cell.addLoopingViewGesture() return cell } @@ -149,6 +91,7 @@ final class MapViewController: BaseViewController { interactor?.checkLocationAuthorizationStatus() setCollectionViewDataSource() createMapAnnotation() + carouselCollectionView.delegate = self } // MARK: - UI + Layout @@ -282,3 +225,9 @@ extension MapViewController: MapDisplayLogic { } } + +extension MapViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + interactor?.playPosts(with: Models.PlayPosts.Request(selectedIndex: indexPath.item)) + } +} diff --git a/iOS/Layover/Layover/Scenes/Map/Views/MapCarouselCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/Map/Views/MapCarouselCollectionViewCell.swift index 81916fd..8dd963f 100644 --- a/iOS/Layover/Layover/Scenes/Map/Views/MapCarouselCollectionViewCell.swift +++ b/iOS/Layover/Layover/Scenes/Map/Views/MapCarouselCollectionViewCell.swift @@ -25,8 +25,6 @@ final class MapCarouselCollectionViewCell: UICollectionViewCell { render() } - var moveToPlaybackSceneCallback: (() -> Void) = { } - func configure(url: URL) { loopingPlayerView.prepareVideo(with: url, timeRange: CMTimeRange(start: .zero, duration: CMTime(value: 1800, timescale: 600))) @@ -49,14 +47,4 @@ final class MapCarouselCollectionViewCell: UICollectionViewCell { layer.cornerRadius = 10 clipsToBounds = true } - - func addLoopingViewGesture() { - let loopingViewGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(moveToPlaybackScene)) - loopingPlayerView.addGestureRecognizer(loopingViewGesture) - } - - @objc func moveToPlaybackScene() { - moveToPlaybackSceneCallback() - loopingPlayerView.pause() - } } From 76e884ae7432ed7e027f748099fa9bf62342c7da Mon Sep 17 00:00:00 2001 From: chopmozzi <44396392+chopmozzi@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:48:47 +0900 Subject: [PATCH 10/10] =?UTF-8?q?:recycle:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Playback/PlaybackInteractor.swift | 12 ++++++------ .../Layover/Scenes/Playback/PlaybackModels.swift | 5 ----- .../Scenes/Playback/PlaybackViewController.swift | 16 ++++++++++++++-- .../Layover/Scenes/Playback/PlaybackWorker.swift | 4 ++-- .../Layover/Scenes/Profile/ProfileModels.swift | 7 +++++++ .../Scenes/Profile/ProfileViewController.swift | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift index 929d09a..77bd93f 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackInteractor.swift @@ -70,8 +70,8 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } func setInitialPlaybackCell() { - guard let parentView else { return } - guard let index else { return } + guard let parentView, + let index else { return } let response: Models.SetInitialPlaybackCell.Response switch parentView { case .home: @@ -124,8 +124,8 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } func playTeleportVideo(with request: PlaybackModels.DisplayPlaybackVideo.Request) { - guard let isTeleport else { return } - guard let posts else { return } + guard let isTeleport, + let posts else { return } if isTeleport { if request.indexPathRow == 1 || request.indexPathRow == (posts.count - 2) { let response: Models.DisplayPlaybackVideo.Response = Models.DisplayPlaybackVideo.Response(prevCell: prevCell, curCell: request.curCell) @@ -142,8 +142,8 @@ final class PlaybackInteractor: PlaybackBusinessLogic, PlaybackDataStore { } func configurePlaybackCell() { - guard let posts else { return } - guard let parentView else { return } + guard let posts, + let parentView else { return } let response: Models.ConfigurePlaybackCell.Response switch parentView { case .home: diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift index d68714c..1dba042 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackModels.swift @@ -30,11 +30,6 @@ enum PlaybackModels { let videoURL: URL } - struct PlaybackViewInfo { - let parentView: ParentView - let videos: [PlaybackVideo] - } - // MARK: - UseCase Load Video List enum LoadPlaybackVideoList { diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift index 8f9e202..517e699 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackViewController.swift @@ -146,6 +146,15 @@ final class PlaybackViewController: BaseViewController { playerSlider.value = Float(CMTimeGetSeconds(currentTime) / CMTimeGetSeconds(duration)) } + private func slowShowPlayerSlider() async { + do { + try await Task.sleep(nanoseconds: 1_000_000_00) + playerSlider.isHidden = false + } catch { + os_log("Falie Waiting show Player Slider") + } + } + @objc private func didChangedSliderValue(_ sender: LOSlider) { let request: Models.SeekVideo.Request = Models.SeekVideo.Request(currentLocation: Float64(sender.value)) interactor?.controlPlaybackMovie(with: request) @@ -173,8 +182,11 @@ extension PlaybackViewController: PlaybackDisplayLogic { curCell.playbackView.playPlayer() setPlayerSlider(at: curCell.playbackView) // Slider가 원점으로 돌아가는 시간 필요 - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { - self.playerSlider.isHidden = false +// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { +// self.playerSlider.isHidden = false +// } + Task { + await slowShowPlayerSlider() } } } diff --git a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift index ebccd27..9afe6c0 100644 --- a/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift +++ b/iOS/Layover/Layover/Scenes/Playback/PlaybackWorker.swift @@ -18,8 +18,8 @@ final class PlaybackWorker { func makeInfiniteScroll(posts: [Post]) -> [Post] { var tempVideos: [Post] = posts - var tempLastVideo: Post = posts[tempVideos.count-1] - var tempFirstVideo: Post = posts[1] + let tempLastVideo: Post = posts[tempVideos.count-1] + let tempFirstVideo: Post = posts[1] tempVideos.insert(tempLastVideo, at: 0) tempVideos.append(tempFirstVideo) return tempVideos diff --git a/iOS/Layover/Layover/Scenes/Profile/ProfileModels.swift b/iOS/Layover/Layover/Scenes/Profile/ProfileModels.swift index f0819ea..56ebbfe 100644 --- a/iOS/Layover/Layover/Scenes/Profile/ProfileModels.swift +++ b/iOS/Layover/Layover/Scenes/Profile/ProfileModels.swift @@ -10,6 +10,13 @@ import UIKit enum ProfileModels { + struct Member: Hashable { + let identifier: Int + let username: String + let introduce: String? + let profileImageURL: URL? + } + enum FetchProfile { struct Request { diff --git a/iOS/Layover/Layover/Scenes/Profile/ProfileViewController.swift b/iOS/Layover/Layover/Scenes/Profile/ProfileViewController.swift index 3bfd6a1..57524c8 100644 --- a/iOS/Layover/Layover/Scenes/Profile/ProfileViewController.swift +++ b/iOS/Layover/Layover/Scenes/Profile/ProfileViewController.swift @@ -173,7 +173,7 @@ extension ProfileViewController: ProfileDisplayLogic { thumbnailCollectionView.dataSource = videoDatasource var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.profileInfo, .thumnail]) - snapshot.appendItems([Member(identifier: 0, + snapshot.appendItems([Models.Member(identifier: 0, username: viewModel.nickname, introduce: viewModel.introduce, profileImageURL: viewModel.profileImageURL)],