From accd516e6e6b59b140e4b43df8506d402c9f7f79 Mon Sep 17 00:00:00 2001 From: kong <1018dbrud@gmail.com> Date: Sun, 19 Nov 2023 01:25:57 +0900 Subject: [PATCH 1/4] =?UTF-8?q?:sparkles:=20Feat:=20=EC=A7=80=EB=8F=84=20?= =?UTF-8?q?=ED=83=AD=20=EC=BA=90=EB=9F=AC=EC=85=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOS/Layover/Layover.xcodeproj/project.pbxproj | 4 + .../MapScene/MapVideoCollectionViewCell.swift | 24 +++++ .../Scenes/MapScene/MapViewController.swift | 87 +++++++++++++++---- 3 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift diff --git a/iOS/Layover/Layover.xcodeproj/project.pbxproj b/iOS/Layover/Layover.xcodeproj/project.pbxproj index 6d504b5..3bef731 100644 --- a/iOS/Layover/Layover.xcodeproj/project.pbxproj +++ b/iOS/Layover/Layover.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ FC2511AD2B04EACD004717BC /* MapInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511AC2B04EACD004717BC /* MapInteractor.swift */; }; FC2511AF2B04EAD9004717BC /* MapPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511AE2B04EAD9004717BC /* MapPresenter.swift */; }; FC2511B12B04EAEC004717BC /* MapModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511B02B04EAEC004717BC /* MapModels.swift */; }; + FC3F3BD82B069EB30080E3A6 /* MapVideoCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */; }; FC49758F2B03432800D8627F /* Pretendard-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC4975862B03432700D8627F /* Pretendard-SemiBold.ttf */; }; FC4975932B03432800D8627F /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC49758A2B03432800D8627F /* Pretendard-Bold.ttf */; }; FC4975942B03432800D8627F /* Pretendard-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC49758B2B03432800D8627F /* Pretendard-Regular.ttf */; }; @@ -108,6 +109,7 @@ FC2511AC2B04EACD004717BC /* MapInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapInteractor.swift; sourceTree = ""; }; FC2511AE2B04EAD9004717BC /* MapPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPresenter.swift; sourceTree = ""; }; FC2511B02B04EAEC004717BC /* MapModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapModels.swift; sourceTree = ""; }; + FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapVideoCollectionViewCell.swift; sourceTree = ""; }; FC4975862B03432700D8627F /* Pretendard-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-SemiBold.ttf"; sourceTree = ""; }; FC49758A2B03432800D8627F /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; FC49758B2B03432800D8627F /* Pretendard-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Regular.ttf"; sourceTree = ""; }; @@ -236,6 +238,7 @@ FC2511AE2B04EAD9004717BC /* MapPresenter.swift */, FC2511AA2B04EA6B004717BC /* MapConfigurator.swift */, FC2511B02B04EAEC004717BC /* MapModels.swift */, + FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */, ); path = MapScene; sourceTree = ""; @@ -507,6 +510,7 @@ FC68E2A12B023326001AABFF /* EndPoint.swift in Sources */, FC2511AF2B04EAD9004717BC /* MapPresenter.swift in Sources */, FC68E2A32B0233BC001AABFF /* NetworkError.swift in Sources */, + FC3F3BD82B069EB30080E3A6 /* MapVideoCollectionViewCell.swift in Sources */, FC7E45962AFF7497004F155A /* DummyExtension.swift in Sources */, 194552252B0478B400299768 /* HomeViewController.swift in Sources */, 194552222B0478B400299768 /* HomeWorker.swift in Sources */, diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift new file mode 100644 index 0000000..3f8eb51 --- /dev/null +++ b/iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift @@ -0,0 +1,24 @@ +// +// MapVideoCollectionViewCell.swift +// Layover +// +// Created by kong on 2023/11/17. +// Copyright © 2023 CodeBomber. All rights reserved. +// + +import UIKit + +final class MapVideoCollectionViewCell: UICollectionViewCell { + + static let identifier = String(describing: MapVideoCollectionViewCell.self) + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .white + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + +} diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift index 1d51d7d..e5d7dfa 100644 --- a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift +++ b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift @@ -15,6 +15,8 @@ protocol MapDisplayLogic: AnyObject { final class MapViewController: BaseViewController { + // MARK: - UI Components + private let mapView: MKMapView = { let mapView = MKMapView() mapView.showsUserLocation = true @@ -22,16 +24,6 @@ final class MapViewController: BaseViewController { return mapView }() - private let currentLocationButton: LOCircleButton = { - let button = LOCircleButton(style: .locate, diameter: 52) - return button - }() - - private let uploadButton: LOCircleButton = { - let button = LOCircleButton(style: .add, diameter: 52) - return button - }() - private let searchButton: UIButton = { var configuration = UIButton.Configuration.filled() var titleContainer = AttributeContainer() @@ -47,7 +39,26 @@ final class MapViewController: BaseViewController { return button }() - // MARK: - UI Components + private let currentLocationButton: LOCircleButton = LOCircleButton(style: .locate, diameter: 52) + + private let uploadButton: LOCircleButton = LOCircleButton(style: .add, diameter: 52) + + private lazy var videoCollectionView: UICollectionView = { + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.createLayout()) + collectionView.backgroundColor = .clear + collectionView.register(MapVideoCollectionViewCell.self, + forCellWithReuseIdentifier: MapVideoCollectionViewCell.identifier) + return collectionView + }() + + private lazy var carouselDatasource = UICollectionViewDiffableDataSource(collectionView: videoCollectionView) { collectionView, indexPath, _ in + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MapVideoCollectionViewCell.identifier, + for: indexPath) as? MapVideoCollectionViewCell else { return UICollectionViewCell() } + cell.layer.cornerRadius = 10 + return cell + } + + // MARK: - Properties var interactor: MapBusinessLogic? @@ -57,17 +68,16 @@ final class MapViewController: BaseViewController { super.viewDidLoad() MapConfigurator.shared.configure(self) interactor?.checkLocationAuthorizationStatus() + setCarouselCollectionView() } // MARK: - UI + Layout override func setConstraints() { - view.addSubviews(mapView, searchButton, currentLocationButton, uploadButton) - - mapView.translatesAutoresizingMaskIntoConstraints = false - searchButton.translatesAutoresizingMaskIntoConstraints = false - currentLocationButton.translatesAutoresizingMaskIntoConstraints = false - uploadButton.translatesAutoresizingMaskIntoConstraints = false + [mapView, searchButton, currentLocationButton, uploadButton, videoCollectionView].forEach { + view.addSubview($0) + $0.translatesAutoresizingMaskIntoConstraints = false + } NSLayoutConstraint.activate([ mapView.topAnchor.constraint(equalTo: view.topAnchor), @@ -79,16 +89,55 @@ final class MapViewController: BaseViewController { searchButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), searchButton.heightAnchor.constraint(equalToConstant: 42), - uploadButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -15), + uploadButton.bottomAnchor.constraint(equalTo: videoCollectionView.topAnchor, constant: -15), uploadButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), currentLocationButton.bottomAnchor.constraint(equalTo: uploadButton.topAnchor, constant: -10), - currentLocationButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16) + currentLocationButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), + + videoCollectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -19), + videoCollectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + videoCollectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + videoCollectionView.heightAnchor.constraint(equalToConstant: 150) ]) } + private func createLayout() -> UICollectionViewLayout { + let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), + heightDimension: .fractionalHeight(1.0)) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(94/375), + heightDimension: .absolute(151)) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + let section = NSCollectionLayoutSection(group: group) + section.orthogonalScrollingBehavior = .groupPagingCentered + section.visibleItemsInvalidationHandler = { (items, offset, environment) in + let containerWidth = environment.container.contentSize.width + items.forEach { item in + let distanceFromCenter = abs((item.center.x - offset.x) - environment.container.contentSize.width / 2.0) + let minScale: CGFloat = 79/94 + let maxScale: CGFloat = 1.0 + let scale = max(maxScale - (distanceFromCenter / containerWidth), minScale) + item.transform = CGAffineTransform(scaleX: scale, y: scale) + } + } + return UICollectionViewCompositionalLayout(section: section) + } + + private func setCarouselCollectionView() { + videoCollectionView.dataSource = carouselDatasource + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([UUID()]) + snapshot.appendItems([1, 2, 3, 4, 5, 6, 7, 8, 9]) + carouselDatasource.apply(snapshot) + } + } extension MapViewController: MapDisplayLogic { } + +#Preview { + MapViewController() +} From 45490b377160d1f865d0ac75a320f51e25899a41 Mon Sep 17 00:00:00 2001 From: kong <1018dbrud@gmail.com> Date: Mon, 20 Nov 2023 03:46:33 +0900 Subject: [PATCH 2/4] =?UTF-8?q?:lipstick:=20Add:=20CarouselLayout=20?= =?UTF-8?q?=EC=9D=B5=EC=8A=A4=ED=85=90=EC=85=98=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOS/Layover/Layover.xcodeproj/project.pbxproj | 12 +++-- .../Extensions/UICollectionViewLayout+.swift | 34 ++++++++++++ ...ft => MapCarouselCollectionViewCell.swift} | 6 +-- .../Scenes/MapScene/MapViewController.swift | 53 ++++++------------- 4 files changed, 62 insertions(+), 43 deletions(-) create mode 100644 iOS/Layover/Layover/Extensions/UICollectionViewLayout+.swift rename iOS/Layover/Layover/Scenes/MapScene/{MapVideoCollectionViewCell.swift => MapCarouselCollectionViewCell.swift} (62%) diff --git a/iOS/Layover/Layover.xcodeproj/project.pbxproj b/iOS/Layover/Layover.xcodeproj/project.pbxproj index 3bef731..ea17af7 100644 --- a/iOS/Layover/Layover.xcodeproj/project.pbxproj +++ b/iOS/Layover/Layover.xcodeproj/project.pbxproj @@ -39,7 +39,7 @@ FC2511AD2B04EACD004717BC /* MapInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511AC2B04EACD004717BC /* MapInteractor.swift */; }; FC2511AF2B04EAD9004717BC /* MapPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511AE2B04EAD9004717BC /* MapPresenter.swift */; }; FC2511B12B04EAEC004717BC /* MapModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511B02B04EAEC004717BC /* MapModels.swift */; }; - FC3F3BD82B069EB30080E3A6 /* MapVideoCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */; }; + FC3F3BD82B069EB30080E3A6 /* MapCarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC3F3BD72B069EB30080E3A6 /* MapCarouselCollectionViewCell.swift */; }; FC49758F2B03432800D8627F /* Pretendard-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC4975862B03432700D8627F /* Pretendard-SemiBold.ttf */; }; FC4975932B03432800D8627F /* Pretendard-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC49758A2B03432800D8627F /* Pretendard-Bold.ttf */; }; FC4975942B03432800D8627F /* Pretendard-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FC49758B2B03432800D8627F /* Pretendard-Regular.ttf */; }; @@ -62,6 +62,7 @@ FC7E45922AFF747A004F155A /* DummyScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7E45912AFF747A004F155A /* DummyScene.swift */; }; FC7E45942AFF7486004F155A /* DummyDesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7E45932AFF7486004F155A /* DummyDesignSystem.swift */; }; FC7E45962AFF7497004F155A /* DummyExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7E45952AFF7497004F155A /* DummyExtension.swift */; }; + FC9BB82C2B094E5500EB72A9 /* UICollectionViewLayout+.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9BB82B2B094E5500EB72A9 /* UICollectionViewLayout+.swift */; }; FCEE0FF22B036B6000195BBE /* LOButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCEE0FF12B036B6000195BBE /* LOButton.swift */; }; FCEE0FF62B03804000195BBE /* LOTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCEE0FF52B03804000195BBE /* LOTextField.swift */; }; FCEE0FFA2B03AF8500195BBE /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCEE0FF92B03AF8400195BBE /* SignUpViewController.swift */; }; @@ -109,7 +110,7 @@ FC2511AC2B04EACD004717BC /* MapInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapInteractor.swift; sourceTree = ""; }; FC2511AE2B04EAD9004717BC /* MapPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPresenter.swift; sourceTree = ""; }; FC2511B02B04EAEC004717BC /* MapModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapModels.swift; sourceTree = ""; }; - FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapVideoCollectionViewCell.swift; sourceTree = ""; }; + FC3F3BD72B069EB30080E3A6 /* MapCarouselCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapCarouselCollectionViewCell.swift; sourceTree = ""; }; FC4975862B03432700D8627F /* Pretendard-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-SemiBold.ttf"; sourceTree = ""; }; FC49758A2B03432800D8627F /* Pretendard-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.ttf"; sourceTree = ""; }; FC49758B2B03432800D8627F /* Pretendard-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Regular.ttf"; sourceTree = ""; }; @@ -135,6 +136,7 @@ FC7E45912AFF747A004F155A /* DummyScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DummyScene.swift; sourceTree = ""; }; FC7E45932AFF7486004F155A /* DummyDesignSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DummyDesignSystem.swift; sourceTree = ""; }; FC7E45952AFF7497004F155A /* DummyExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DummyExtension.swift; sourceTree = ""; }; + FC9BB82B2B094E5500EB72A9 /* UICollectionViewLayout+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionViewLayout+.swift"; sourceTree = ""; }; FCEE0FF12B036B6000195BBE /* LOButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LOButton.swift; sourceTree = ""; }; FCEE0FF52B03804000195BBE /* LOTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LOTextField.swift; sourceTree = ""; }; FCEE0FF92B03AF8400195BBE /* SignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SignUpViewController.swift; path = ../SignUpViewController.swift; sourceTree = ""; }; @@ -238,7 +240,7 @@ FC2511AE2B04EAD9004717BC /* MapPresenter.swift */, FC2511AA2B04EA6B004717BC /* MapConfigurator.swift */, FC2511B02B04EAEC004717BC /* MapModels.swift */, - FC3F3BD72B069EB30080E3A6 /* MapVideoCollectionViewCell.swift */, + FC3F3BD72B069EB30080E3A6 /* MapCarouselCollectionViewCell.swift */, ); path = MapScene; sourceTree = ""; @@ -368,6 +370,7 @@ FC4975982B03439000D8627F /* UIFont+.swift */, 194552012B038B8300299768 /* OSLog+.swift */, 194552292B04883800299768 /* UIView+.swift */, + FC9BB82B2B094E5500EB72A9 /* UICollectionViewLayout+.swift */, ); path = Extensions; sourceTree = ""; @@ -510,7 +513,7 @@ FC68E2A12B023326001AABFF /* EndPoint.swift in Sources */, FC2511AF2B04EAD9004717BC /* MapPresenter.swift in Sources */, FC68E2A32B0233BC001AABFF /* NetworkError.swift in Sources */, - FC3F3BD82B069EB30080E3A6 /* MapVideoCollectionViewCell.swift in Sources */, + FC3F3BD82B069EB30080E3A6 /* MapCarouselCollectionViewCell.swift in Sources */, FC7E45962AFF7497004F155A /* DummyExtension.swift in Sources */, 194552252B0478B400299768 /* HomeViewController.swift in Sources */, 194552222B0478B400299768 /* HomeWorker.swift in Sources */, @@ -541,6 +544,7 @@ FC2511A02B045C0A004717BC /* SignUpInteractor.swift in Sources */, 1945522A2B04883800299768 /* UIView+.swift in Sources */, 19C7AFCE2B02410F003B35F2 /* AuthManager.swift in Sources */, + FC9BB82C2B094E5500EB72A9 /* UICollectionViewLayout+.swift in Sources */, 194552232B0478B400299768 /* HomeRouter.swift in Sources */, FC7E45902AFF746E004F155A /* DummyWorker.swift in Sources */, 1945520F2B03AEA400299768 /* Configurator.swift in Sources */, diff --git a/iOS/Layover/Layover/Extensions/UICollectionViewLayout+.swift b/iOS/Layover/Layover/Extensions/UICollectionViewLayout+.swift new file mode 100644 index 0000000..af7bd1e --- /dev/null +++ b/iOS/Layover/Layover/Extensions/UICollectionViewLayout+.swift @@ -0,0 +1,34 @@ +// +// UICollectionViewLayout+.swift +// Layover +// +// Created by kong on 2023/11/19. +// Copyright © 2023 CodeBomber. All rights reserved. +// + +import UIKit + +extension UICollectionViewLayout { + static func createCarouselLayout(groupWidthDimension: CGFloat, + groupHeightDimension: CGFloat, + maximumZoomScale: CGFloat, + minimumZoomScale: CGFloat) -> UICollectionViewLayout { + let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1)) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(groupWidthDimension), + heightDimension: .fractionalHeight(groupHeightDimension)) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + let section = NSCollectionLayoutSection(group: group) + section.orthogonalScrollingBehavior = .groupPagingCentered + section.visibleItemsInvalidationHandler = { items, offset, environment in + let containerWidth = environment.container.contentSize.width + items.forEach { item in + let distanceFromCenter = abs((item.center.x - offset.x) - environment.container.contentSize.width / 2.0) + let scale = max(maximumZoomScale - (distanceFromCenter / containerWidth), minimumZoomScale) + item.transform = CGAffineTransform(scaleX: scale, y: scale) + } + } + return UICollectionViewCompositionalLayout(section: section) + } +} diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift similarity index 62% rename from iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift rename to iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift index 3f8eb51..963da31 100644 --- a/iOS/Layover/Layover/Scenes/MapScene/MapVideoCollectionViewCell.swift +++ b/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift @@ -1,5 +1,5 @@ // -// MapVideoCollectionViewCell.swift +// MapCarouselCollectionViewCell.swift // Layover // // Created by kong on 2023/11/17. @@ -8,9 +8,9 @@ import UIKit -final class MapVideoCollectionViewCell: UICollectionViewCell { +final class MapCarouselCollectionViewCell: UICollectionViewCell { - static let identifier = String(describing: MapVideoCollectionViewCell.self) + static let identifier = String(describing: MapCarouselCollectionViewCell.self) override init(frame: CGRect) { super.init(frame: frame) diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift index e5d7dfa..56afc57 100644 --- a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift +++ b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift @@ -43,17 +43,20 @@ final class MapViewController: BaseViewController { private let uploadButton: LOCircleButton = LOCircleButton(style: .add, diameter: 52) - private lazy var videoCollectionView: UICollectionView = { - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.createLayout()) + private lazy var carouselCollectionView: UICollectionView = { + let layout: UICollectionViewLayout = .createCarouselLayout(groupWidthDimension: 94/375, + groupHeightDimension: 117/151, + maximumZoomScale: 1.0, + minimumZoomScale: 79/94) + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.backgroundColor = .clear - collectionView.register(MapVideoCollectionViewCell.self, - forCellWithReuseIdentifier: MapVideoCollectionViewCell.identifier) + collectionView.register(MapCarouselCollectionViewCell.self, forCellWithReuseIdentifier: MapCarouselCollectionViewCell.identifier) return collectionView }() - private lazy var carouselDatasource = UICollectionViewDiffableDataSource(collectionView: videoCollectionView) { collectionView, indexPath, _ in - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MapVideoCollectionViewCell.identifier, - for: indexPath) as? MapVideoCollectionViewCell else { return UICollectionViewCell() } + private lazy var carouselDatasource = UICollectionViewDiffableDataSource(collectionView: carouselCollectionView) { collectionView, indexPath, _ in + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MapCarouselCollectionViewCell.identifier, + for: indexPath) as? MapCarouselCollectionViewCell else { return UICollectionViewCell() } cell.layer.cornerRadius = 10 return cell } @@ -74,7 +77,7 @@ final class MapViewController: BaseViewController { // MARK: - UI + Layout override func setConstraints() { - [mapView, searchButton, currentLocationButton, uploadButton, videoCollectionView].forEach { + [mapView, searchButton, currentLocationButton, uploadButton, carouselCollectionView].forEach { view.addSubview($0) $0.translatesAutoresizingMaskIntoConstraints = false } @@ -89,43 +92,21 @@ final class MapViewController: BaseViewController { searchButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), searchButton.heightAnchor.constraint(equalToConstant: 42), - uploadButton.bottomAnchor.constraint(equalTo: videoCollectionView.topAnchor, constant: -15), + uploadButton.bottomAnchor.constraint(equalTo: carouselCollectionView.topAnchor, constant: -15), uploadButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), currentLocationButton.bottomAnchor.constraint(equalTo: uploadButton.topAnchor, constant: -10), currentLocationButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), - videoCollectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -19), - videoCollectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - videoCollectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - videoCollectionView.heightAnchor.constraint(equalToConstant: 150) + carouselCollectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -19), + carouselCollectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + carouselCollectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + carouselCollectionView.heightAnchor.constraint(equalToConstant: 150) ]) } - private func createLayout() -> UICollectionViewLayout { - let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), - heightDimension: .fractionalHeight(1.0)) - let item = NSCollectionLayoutItem(layoutSize: itemSize) - let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(94/375), - heightDimension: .absolute(151)) - let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) - let section = NSCollectionLayoutSection(group: group) - section.orthogonalScrollingBehavior = .groupPagingCentered - section.visibleItemsInvalidationHandler = { (items, offset, environment) in - let containerWidth = environment.container.contentSize.width - items.forEach { item in - let distanceFromCenter = abs((item.center.x - offset.x) - environment.container.contentSize.width / 2.0) - let minScale: CGFloat = 79/94 - let maxScale: CGFloat = 1.0 - let scale = max(maxScale - (distanceFromCenter / containerWidth), minScale) - item.transform = CGAffineTransform(scaleX: scale, y: scale) - } - } - return UICollectionViewCompositionalLayout(section: section) - } - private func setCarouselCollectionView() { - videoCollectionView.dataSource = carouselDatasource + carouselCollectionView.dataSource = carouselDatasource var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([UUID()]) snapshot.appendItems([1, 2, 3, 4, 5, 6, 7, 8, 9]) From 3167bbea2a232b44e2c608c930fcf86e9cc11d8c Mon Sep 17 00:00:00 2001 From: kong <1018dbrud@gmail.com> Date: Mon, 20 Nov 2023 03:52:52 +0900 Subject: [PATCH 3/4] =?UTF-8?q?:lipstick:=20Update:=20card=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift index 56afc57..b7f7f94 100644 --- a/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift +++ b/iOS/Layover/Layover/Scenes/MapScene/MapViewController.swift @@ -45,9 +45,9 @@ final class MapViewController: BaseViewController { private lazy var carouselCollectionView: UICollectionView = { let layout: UICollectionViewLayout = .createCarouselLayout(groupWidthDimension: 94/375, - groupHeightDimension: 117/151, + groupHeightDimension: 1.0, maximumZoomScale: 1.0, - minimumZoomScale: 79/94) + minimumZoomScale: 73/94) let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.backgroundColor = .clear collectionView.register(MapCarouselCollectionViewCell.self, forCellWithReuseIdentifier: MapCarouselCollectionViewCell.identifier) @@ -101,7 +101,7 @@ final class MapViewController: BaseViewController { carouselCollectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -19), carouselCollectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), carouselCollectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - carouselCollectionView.heightAnchor.constraint(equalToConstant: 150) + carouselCollectionView.heightAnchor.constraint(equalToConstant: 151) ]) } From 0be165411cbbcec7c6700d393cad9ae8f690d09f Mon Sep 17 00:00:00 2001 From: kong <1018dbrud@gmail.com> Date: Mon, 20 Nov 2023 17:04:13 +0900 Subject: [PATCH 4/4] =?UTF-8?q?:rotating=5Flight:=20Fix:=20identifier=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift index 963da31..6aa805d 100644 --- a/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift +++ b/iOS/Layover/Layover/Scenes/MapScene/MapCarouselCollectionViewCell.swift @@ -10,8 +10,6 @@ import UIKit final class MapCarouselCollectionViewCell: UICollectionViewCell { - static let identifier = String(describing: MapCarouselCollectionViewCell.self) - override init(frame: CGRect) { super.init(frame: frame) backgroundColor = .white