From a4a69b37c19846489a44b0bb509e2b1adb9b419f Mon Sep 17 00:00:00 2001 From: loinsir Date: Mon, 20 Nov 2023 21:37:48 +0900 Subject: [PATCH 1/3] =?UTF-8?q?:sparkles:=20feat:=20LayoverConstraintWrapp?= =?UTF-8?q?er=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 | 20 ++++- .../LayoverConstraintWrapper+UIView.swift | 73 +++++++++++++++++++ .../LayoverConstraintWrapper.swift | 32 ++++++++ .../Cell/HomeCarouselCollectionViewCell.swift | 7 ++ .../Scenes/Home/HomeViewController.swift | 1 + 5 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift create mode 100644 iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift diff --git a/iOS/Layover/Layover.xcodeproj/project.pbxproj b/iOS/Layover/Layover.xcodeproj/project.pbxproj index ac669046..dff0e7ca 100644 --- a/iOS/Layover/Layover.xcodeproj/project.pbxproj +++ b/iOS/Layover/Layover.xcodeproj/project.pbxproj @@ -31,8 +31,11 @@ 194552392B05230E00299768 /* HomeCarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194552382B05230E00299768 /* HomeCarouselCollectionViewCell.swift */; }; 1945523B2B05258200299768 /* HomeConfigurator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1945523A2B05258200299768 /* HomeConfigurator.swift */; }; 19743C052B06940D001E405A /* PlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19743C042B06940D001E405A /* PlayerView.swift */; }; + 19ABC1C32B0B78C800736813 /* LayoverConstraintWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19ABC1C22B0B78C800736813 /* LayoverConstraintWrapper.swift */; }; + 19ABC1C52B0B7D0100736813 /* LayoverConstraintWrapper+UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19ABC1C42B0B7D0100736813 /* LayoverConstraintWrapper+UIView.swift */; }; 19C7AFCE2B02410F003B35F2 /* AuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19C7AFCD2B02410F003B35F2 /* AuthManager.swift */; }; 19C7AFD62B02584D003B35F2 /* KeychainStored.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19C7AFD52B02584D003B35F2 /* KeychainStored.swift */; }; + 19E79AC02B0A85D0009EA9ED /* LoopingPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E79ABF2B0A85D0009EA9ED /* LoopingPlayerView.swift */; }; 835A61902B067D61002F22A5 /* LOSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A618F2B067D61002F22A5 /* LOSlider.swift */; }; 835A61922B067FEC002F22A5 /* LOTagStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A61912B067FEC002F22A5 /* LOTagStackView.swift */; }; 835A61942B068096002F22A5 /* LODescriptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A61932B068096002F22A5 /* LODescriptionView.swift */; }; @@ -42,7 +45,6 @@ 835A61A02B068115002F22A5 /* PlaybackModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A619A2B068115002F22A5 /* PlaybackModels.swift */; }; 835A61A12B068115002F22A5 /* PlaybackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A619B2B068115002F22A5 /* PlaybackViewController.swift */; }; 835A61A22B068115002F22A5 /* PlaybackInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835A619C2B068115002F22A5 /* PlaybackInteractor.swift */; }; - 19E79AC02B0A85D0009EA9ED /* LoopingPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E79ABF2B0A85D0009EA9ED /* LoopingPlayerView.swift */; }; FC2511A02B045C0A004717BC /* SignUpInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC25119F2B045C0A004717BC /* SignUpInteractor.swift */; }; FC2511A22B045C3F004717BC /* SignUpPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511A12B045C3F004717BC /* SignUpPresenter.swift */; }; FC2511A42B045D6C004717BC /* SignUpModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2511A32B045D6C004717BC /* SignUpModels.swift */; }; @@ -115,8 +117,11 @@ 194552382B05230E00299768 /* HomeCarouselCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCarouselCollectionViewCell.swift; sourceTree = ""; }; 1945523A2B05258200299768 /* HomeConfigurator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeConfigurator.swift; sourceTree = ""; }; 19743C042B06940D001E405A /* PlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerView.swift; sourceTree = ""; }; + 19ABC1C22B0B78C800736813 /* LayoverConstraintWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoverConstraintWrapper.swift; sourceTree = ""; }; + 19ABC1C42B0B7D0100736813 /* LayoverConstraintWrapper+UIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LayoverConstraintWrapper+UIView.swift"; sourceTree = ""; }; 19C7AFCD2B02410F003B35F2 /* AuthManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthManager.swift; sourceTree = ""; }; 19C7AFD52B02584D003B35F2 /* KeychainStored.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStored.swift; sourceTree = ""; }; + 19E79ABF2B0A85D0009EA9ED /* LoopingPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopingPlayerView.swift; sourceTree = ""; }; 835A618F2B067D61002F22A5 /* LOSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LOSlider.swift; sourceTree = ""; }; 835A61912B067FEC002F22A5 /* LOTagStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LOTagStackView.swift; sourceTree = ""; }; 835A61932B068096002F22A5 /* LODescriptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LODescriptionView.swift; sourceTree = ""; }; @@ -126,7 +131,6 @@ 835A619A2B068115002F22A5 /* PlaybackModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackModels.swift; sourceTree = ""; }; 835A619B2B068115002F22A5 /* PlaybackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackViewController.swift; sourceTree = ""; }; 835A619C2B068115002F22A5 /* PlaybackInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackInteractor.swift; sourceTree = ""; }; - 19E79ABF2B0A85D0009EA9ED /* LoopingPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopingPlayerView.swift; sourceTree = ""; }; FC25119F2B045C0A004717BC /* SignUpInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpInteractor.swift; sourceTree = ""; }; FC2511A12B045C3F004717BC /* SignUpPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpPresenter.swift; sourceTree = ""; }; FC2511A32B045D6C004717BC /* SignUpModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpModels.swift; sourceTree = ""; }; @@ -233,6 +237,15 @@ path = Cell; sourceTree = ""; }; + 19ABC1C62B0B8A5B00736813 /* LayoverConstraint */ = { + isa = PBXGroup; + children = ( + 19ABC1C22B0B78C800736813 /* LayoverConstraintWrapper.swift */, + 19ABC1C42B0B7D0100736813 /* LayoverConstraintWrapper+UIView.swift */, + ); + path = LayoverConstraint; + sourceTree = ""; + }; 19BB8A572B07BEE30070B922 /* UIComponents */ = { isa = PBXGroup; children = ( @@ -429,6 +442,7 @@ FC7E45812AFF6FF9004F155A /* Extensions */ = { isa = PBXGroup; children = ( + 19ABC1C62B0B8A5B00736813 /* LayoverConstraint */, FC7E45952AFF7497004F155A /* DummyExtension.swift */, FC4975982B03439000D8627F /* UIFont+.swift */, 194552012B038B8300299768 /* OSLog+.swift */, @@ -617,12 +631,14 @@ 835A61922B067FEC002F22A5 /* LOTagStackView.swift in Sources */, FC7E45902AFF746E004F155A /* DummyWorker.swift in Sources */, 835A61A12B068115002F22A5 /* PlaybackViewController.swift in Sources */, + 19ABC1C32B0B78C800736813 /* LayoverConstraintWrapper.swift in Sources */, 1945520F2B03AEA400299768 /* Configurator.swift in Sources */, 835A619F2B068115002F22A5 /* PlaybackRouter.swift in Sources */, FC2511B12B04EAEC004717BC /* MapModels.swift in Sources */, FC68E29F2B023315001AABFF /* HTTPMethod.swift in Sources */, 835A619D2B068115002F22A5 /* PlaybackPresenter.swift in Sources */, FCEE0FFA2B03AF8500195BBE /* SignUpViewController.swift in Sources */, + 19ABC1C52B0B7D0100736813 /* LayoverConstraintWrapper+UIView.swift in Sources */, 194551F32B037F2D00299768 /* LoginWorker.swift in Sources */, 835A61902B067D61002F22A5 /* LOSlider.swift in Sources */, 19E79AC02B0A85D0009EA9ED /* LoopingPlayerView.swift in Sources */, diff --git a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift new file mode 100644 index 00000000..c3d17102 --- /dev/null +++ b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift @@ -0,0 +1,73 @@ +// +// LayoverConstraintWrapper+UIView.swift +// Layover +// +// Created by 김인환 on 11/20/23. +// Copyright © 2023 CodeBomber. All rights reserved. +// + +import UIKit + +extension LayoverConstraintWrapper where Base: UIView { + + func makeConstraints(_ closure: (ConstraintMaker) -> Void) { + base.translatesAutoresizingMaskIntoConstraints = false + closure(ConstraintMaker(base)) + } +} + +final class ConstraintMaker { + let view: UIView + + init(_ view: UIView) { + self.view = view + } + + func topAnchor(equalTo anchor: NSLayoutYAxisAnchor, constant: CGFloat = 0) { + view.topAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + } + + func bottomAnchor(equalTo anchor: NSLayoutYAxisAnchor, constant: CGFloat = 0) { + view.bottomAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + } + + func leadingAnchor(equalTo anchor: NSLayoutXAxisAnchor, constant: CGFloat = 0) { + view.leadingAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + } + + func trailingAnchor(equalTo anchor: NSLayoutXAxisAnchor, constant: CGFloat = 0) { + view.trailingAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + } + + func widthAnchor(equalToConstant constant: CGFloat) { + view.widthAnchor.constraint(equalToConstant: constant).isActive = true + } + + func widthAnchor(equalTo anchor: NSLayoutDimension, multiplier: CGFloat = 1.0) { + view.widthAnchor.constraint(equalTo: anchor, multiplier: multiplier).isActive = true + } + + func heightAnchor(equalToConstant constant: CGFloat) { + view.heightAnchor.constraint(equalToConstant: constant).isActive = true + } + + func heightAnchor(equalTo anchor: NSLayoutDimension, multiplier: CGFloat = 1.0) { + view.heightAnchor.constraint(equalTo: anchor, multiplier: multiplier).isActive = true + } + + func verticalAnchor(equalTo relativeView: UIView) { + topAnchor(equalTo: relativeView.topAnchor) + bottomAnchor(equalTo: relativeView.bottomAnchor) + } + + func horizontalAnchor(equalTo relativeView: UIView) { + leadingAnchor(equalTo: relativeView.leadingAnchor) + trailingAnchor(equalTo: relativeView.trailingAnchor) + } + + func equalToSuperView() { + guard let superview = view.superview else { return } + verticalAnchor(equalTo: superview) + horizontalAnchor(equalTo: superview) + } +} diff --git a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift new file mode 100644 index 00000000..981e959a --- /dev/null +++ b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift @@ -0,0 +1,32 @@ +// +// LayoverConstraintWrapper.swift +// Layover +// +// Created by 김인환 on 11/20/23. +// Copyright © 2023 CodeBomber. All rights reserved. +// + +import UIKit + +struct LayoverConstraintWrapper { + let base: Base + init(base: Base) { + self.base = base + } +} + +protocol LayoverConstraintCompatible { + associatedtype LayoverConstraintBase + + var lor: LayoverConstraintWrapper { get } +} + +extension LayoverConstraintCompatible { + var lor: LayoverConstraintWrapper { + get { + return LayoverConstraintWrapper(base: self) + } set { } + } +} + +extension UIView: LayoverConstraintCompatible { } diff --git a/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift index 5b30e92d..a71df158 100644 --- a/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift +++ b/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift @@ -12,6 +12,8 @@ final class HomeCarouselCollectionViewCell: UICollectionViewCell { // MARK: - Properties + private let loopingPlayerView = LoopingPlayerView() + // MARK: - UI Components // MARK: - Object lifecycle @@ -35,7 +37,12 @@ final class HomeCarouselCollectionViewCell: UICollectionViewCell { } private func setConstraints() { + addSubviews(loopingPlayerView) + loopingPlayerView.backgroundColor = .green + loopingPlayerView.lor.makeConstraints { + $0.equalToSuperView() + } } // MARK: - Methods diff --git a/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift b/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift index 0a944bc3..8d1b1768 100644 --- a/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift +++ b/iOS/Layover/Layover/Scenes/Home/HomeViewController.swift @@ -40,6 +40,7 @@ final class HomeViewController: BaseViewController, HomeDisplayLogic { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: HomeCarouselCollectionViewCell.identifier, for: indexPath) as? HomeCarouselCollectionViewCell else { return UICollectionViewCell() } cell.layer.cornerRadius = 10 + cell.clipsToBounds = true return cell } From 62c6288cd80173e1c57954bee636b1d3f068c4de Mon Sep 17 00:00:00 2001 From: loinsir Date: Mon, 20 Nov 2023 22:39:49 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:sparkles:=20feat:=20centerX,=20Y=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LayoverConstraintWrapper+UIView.swift | 8 ++++++++ .../LayoverConstraint/LayoverConstraintWrapper.swift | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift index c3d17102..9e4ad2bb 100644 --- a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift +++ b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift @@ -65,6 +65,14 @@ final class ConstraintMaker { trailingAnchor(equalTo: relativeView.trailingAnchor) } + func centerXAnchor(equalTo anchor: NSLayoutAnchor) { + view.centerXAnchor.constraint(equalTo: anchor).isActive = true + } + + func centerYAnchor(equalTo anchor: NSLayoutAnchor) { + view.centerYAnchor.constraint(equalTo: anchor).isActive = true + } + func equalToSuperView() { guard let superview = view.superview else { return } verticalAnchor(equalTo: superview) diff --git a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift index 981e959a..62f145ce 100644 --- a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift +++ b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper.swift @@ -10,9 +10,6 @@ import UIKit struct LayoverConstraintWrapper { let base: Base - init(base: Base) { - self.base = base - } } protocol LayoverConstraintCompatible { @@ -25,7 +22,7 @@ extension LayoverConstraintCompatible { var lor: LayoverConstraintWrapper { get { return LayoverConstraintWrapper(base: self) - } set { } + } } } From bc623b3d1dd4380816655318b94751e65fe7c7a4 Mon Sep 17 00:00:00 2001 From: loinsir Date: Tue, 21 Nov 2023 17:01:38 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:sparkles:=20feat:=20ConstraintEdges=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LayoverConstraintWrapper+UIView.swift | 138 ++++++++++++++---- .../Cell/HomeCarouselCollectionViewCell.swift | 2 +- 2 files changed, 107 insertions(+), 33 deletions(-) diff --git a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift index 9e4ad2bb..f0c4bfad 100644 --- a/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift +++ b/iOS/Layover/Layover/Extensions/LayoverConstraint/LayoverConstraintWrapper+UIView.swift @@ -17,65 +17,139 @@ extension LayoverConstraintWrapper where Base: UIView { } final class ConstraintMaker { - let view: UIView - init(_ view: UIView) { - self.view = view + // MARK: Properties + + private let view: UIView + + var edges: ConstraintEdges { + ConstraintEdges(view) } - func topAnchor(equalTo anchor: NSLayoutYAxisAnchor, constant: CGFloat = 0) { - view.topAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + var top: ConstraintEdges { + ConstraintEdges(view).top } - func bottomAnchor(equalTo anchor: NSLayoutYAxisAnchor, constant: CGFloat = 0) { - view.bottomAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + var bottom: ConstraintEdges { + ConstraintEdges(view).bottom } - func leadingAnchor(equalTo anchor: NSLayoutXAxisAnchor, constant: CGFloat = 0) { - view.leadingAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + var leading: ConstraintEdges { + ConstraintEdges(view).leading } - func trailingAnchor(equalTo anchor: NSLayoutXAxisAnchor, constant: CGFloat = 0) { - view.trailingAnchor.constraint(equalTo: anchor, constant: constant).isActive = true + var trailing: ConstraintEdges { + ConstraintEdges(view).trailing } - func widthAnchor(equalToConstant constant: CGFloat) { - view.widthAnchor.constraint(equalToConstant: constant).isActive = true + var width: ConstraintEdges { + ConstraintEdges(view).width } - func widthAnchor(equalTo anchor: NSLayoutDimension, multiplier: CGFloat = 1.0) { - view.widthAnchor.constraint(equalTo: anchor, multiplier: multiplier).isActive = true + var height: ConstraintEdges { + ConstraintEdges(view).height } - func heightAnchor(equalToConstant constant: CGFloat) { - view.heightAnchor.constraint(equalToConstant: constant).isActive = true + var centerX: ConstraintEdges { + ConstraintEdges(view).centerX } - func heightAnchor(equalTo anchor: NSLayoutDimension, multiplier: CGFloat = 1.0) { - view.heightAnchor.constraint(equalTo: anchor, multiplier: multiplier).isActive = true + var centerY: ConstraintEdges { + ConstraintEdges(view).centerY } - func verticalAnchor(equalTo relativeView: UIView) { - topAnchor(equalTo: relativeView.topAnchor) - bottomAnchor(equalTo: relativeView.bottomAnchor) + var center: ConstraintEdges { + ConstraintEdges(view).center + } + + // MARK: Initializer + + init(_ view: UIView) { + self.view = view } +} + +final class ConstraintEdges { + + // MARK: Properties + + private let view: UIView + + private var topAnchor: NSLayoutYAxisAnchor? + private var leadingAnchor: NSLayoutXAxisAnchor? + private var trailingAnchor: NSLayoutXAxisAnchor? + private var bottomAnchor: NSLayoutYAxisAnchor? - func horizontalAnchor(equalTo relativeView: UIView) { - leadingAnchor(equalTo: relativeView.leadingAnchor) - trailingAnchor(equalTo: relativeView.trailingAnchor) + private var widthAnchor: NSLayoutDimension? + private var heightAnchor: NSLayoutDimension? + + private var centerXAnchor: NSLayoutXAxisAnchor? + private var centerYAnchor: NSLayoutYAxisAnchor? + + // MARK: Builder Pattern Properties + + var top: ConstraintEdges { + topAnchor = view.topAnchor + return self } - func centerXAnchor(equalTo anchor: NSLayoutAnchor) { - view.centerXAnchor.constraint(equalTo: anchor).isActive = true + var leading: ConstraintEdges { + leadingAnchor = view.leadingAnchor + return self } - func centerYAnchor(equalTo anchor: NSLayoutAnchor) { - view.centerYAnchor.constraint(equalTo: anchor).isActive = true + var trailing: ConstraintEdges { + trailingAnchor = view.trailingAnchor + return self } + var bottom: ConstraintEdges { + bottomAnchor = view.bottomAnchor + return self + } + + var width: ConstraintEdges { + widthAnchor = view.widthAnchor + return self + } + + var height: ConstraintEdges { + heightAnchor = view.heightAnchor + return self + } + + var centerX: ConstraintEdges { + centerXAnchor = view.centerXAnchor + return self + } + + var centerY: ConstraintEdges { + centerYAnchor = view.centerYAnchor + return self + } + + var center: ConstraintEdges { + centerXAnchor = view.centerXAnchor + centerYAnchor = view.centerYAnchor + return self + } + + // MARK: Intializer + + init(_ view: UIView) { + self.view = view + } + + // MARK: Methods + func equalToSuperView() { - guard let superview = view.superview else { return } - verticalAnchor(equalTo: superview) - horizontalAnchor(equalTo: superview) + guard let superView = view.superview else { return } + + NSLayoutConstraint.activate([ + topAnchor?.constraint(equalTo: superView.topAnchor), + leadingAnchor?.constraint(equalTo: superView.leadingAnchor), + trailingAnchor?.constraint(equalTo: superView.trailingAnchor), + bottomAnchor?.constraint(equalTo: superView.bottomAnchor) + ].compactMap { $0 }) } } diff --git a/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift b/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift index a71df158..fa6bf1fd 100644 --- a/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift +++ b/iOS/Layover/Layover/Scenes/Home/Cell/HomeCarouselCollectionViewCell.swift @@ -41,7 +41,7 @@ final class HomeCarouselCollectionViewCell: UICollectionViewCell { loopingPlayerView.backgroundColor = .green loopingPlayerView.lor.makeConstraints { - $0.equalToSuperView() + $0.center.equalToSuperView() } }