From b20aa33fb92bf0931dad623a3dd52ea24decc53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Wed, 11 May 2022 21:55:38 +0900 Subject: [PATCH 01/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#136=20-=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=B0=BD=20=EA=B8=B0=EB=B3=B8=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudioMapSearchViewController.swift | 1 - .../StudioMapViewController/StudioMapViewController.swift | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift index 11c334a..530aa95 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift @@ -86,7 +86,6 @@ class StudioMapSearchViewController: UIViewController { switch self.status { case .originStudioVC : self.navigationBar.popViewController = { - print("버튼 누름") self.view.endEditing(true) self.dismiss(animated: true, completion: nil) } diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift index aeb253e..f0b3c9e 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift @@ -318,7 +318,7 @@ extension UITextField { NSAttributedString.Key.foregroundColor: UIColor.grey2, NSAttributedString.Key.font: UIFont(name: "NotoSansKR-Regular", size: 14)! ] - self.attributedPlaceholder = NSAttributedString(string: "추억을 현상할 현상소를 검색해보세요", attributes: attributes) + self.attributedPlaceholder = NSAttributedString(string: "현상소 이름 또는 주소로 검색해보세요", attributes: attributes) } } From 86f60389708b8d37e569c2816d8f0d178fa85c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Wed, 11 May 2022 23:59:17 +0900 Subject: [PATCH 02/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#136=20-=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=B0=BD=20=EC=83=81=ED=83=9C=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EC=82=AD=EC=A0=9C=20=EB=B2=84=ED=8A=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudioMapSearchViewController.swift | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift index 530aa95..c26fe93 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift @@ -13,7 +13,8 @@ class StudioMapSearchViewController: UIViewController { var serverSearchStudios: StudioSearchResponse? let backGroundView = UIView() let magnifyingGlassButton = UIButton() - let searchPlaceTextField = UITextField() // searchBar + let clearButton = UIButton() + let searchPlaceTextField = UITextField() let tableView = UITableView() let dividerView = UIView() let noSearchImageView = UIImageView() @@ -55,6 +56,10 @@ class StudioMapSearchViewController: UIViewController { $0.font = .body2 $0.setPlaceHolder() $0.addLeftPadding() + $0.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), + for: .editingDidBegin) + $0.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), + for: .editingChanged) $0.snp.makeConstraints { $0.top.equalTo(self.view.safeAreaLayoutGuide).inset(68) $0.leading.equalTo(self.view).inset(18) @@ -72,6 +77,17 @@ class StudioMapSearchViewController: UIViewController { $0.trailing.equalTo(self.searchPlaceTextField).inset(18) } } + view.add(clearButton) { + $0.setImage(Asset.icnClear.image, for: .normal) + $0.addTarget(self, action: #selector(self.touchClearButton), for: .touchUpInside) + $0.snp.makeConstraints { + $0.top.equalTo(self.searchPlaceTextField).inset(11) + $0.leading.equalTo(self.searchPlaceTextField).inset(295) + $0.bottom.equalTo(self.searchPlaceTextField).inset(11) + $0.trailing.equalTo(self.searchPlaceTextField).inset(18) + } + } + clearButton.isHidden = true view.add(dividerView) { $0.backgroundColor = .darkGrey3 $0.snp.makeConstraints { @@ -130,12 +146,11 @@ class StudioMapSearchViewController: UIViewController { tableView.register(StudioMapSearchTableViewCell.self, forCellReuseIdentifier: Const.Xib.studioSearchTableViewCell) } - func setUpTextField() { /// 수정 + func setUpTextField() { searchPlaceTextField.becomeFirstResponder() } func changeEmptySearchView() { - print("call") view.add(noSearchImageView) { $0.image = UIImage(named: "noSearch") $0.snp.makeConstraints { @@ -151,11 +166,24 @@ class StudioMapSearchViewController: UIViewController { self.view.endEditing(true) } + // MARK: - @objc + @objc func textFieldDidChange(textField: UITextField) { + clearButton.isHidden = (searchPlaceTextField.text?.isEmpty) ?? true + magnifyingGlassButton.isHidden = !(clearButton.isHidden) + + } + @objc func touchSearchButton(_ sender: UIButton) { self.view.endEditing(true) changeEmptySearchView() /// (임시로 실행) 토큰 나오면 이 줄 삭제하기 searchStudiosWithAPI(keyword: searchPlaceTextField.text ?? "") } + + @objc func touchClearButton(_ sender: UIButton) { + searchPlaceTextField.text = "" + magnifyingGlassButton.isHidden = false + clearButton.isHidden = true + } } // MARK: - Extension - UITableViewDataSource, UITableViewDelegate From e8f20c00103c76d000617668fb95f2f9337532fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 12 May 2022 00:50:53 +0900 Subject: [PATCH 03/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#136=20-=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=EC=B0=BD=20=EC=83=81=ED=83=9C=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20=EB=B9=88=20=EA=B2=80=EC=83=89=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EC=B0=BD=20=ED=99=94=EB=A9=B4=20=EA=B5=AC=ED=98=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudioMapSearchViewController.swift | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift index c26fe93..646291b 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift @@ -96,6 +96,16 @@ class StudioMapSearchViewController: UIViewController { $0.height.equalTo(2) } } + view.add(noSearchImageView) { + $0.image = UIImage(named: "noSearch") + $0.snp.makeConstraints { + $0.top.equalTo(self.searchPlaceTextField.snp.bottom).offset(135) + $0.centerX.equalTo(self.view.snp.centerX) + $0.height.equalTo(223) + $0.width.equalTo(246) + } + } + noSearchImageView.isHidden = true } private func layoutNavigaionBar() { view.add(navigationBar) { @@ -151,15 +161,7 @@ class StudioMapSearchViewController: UIViewController { } func changeEmptySearchView() { - view.add(noSearchImageView) { - $0.image = UIImage(named: "noSearch") - $0.snp.makeConstraints { - $0.top.equalTo(self.searchPlaceTextField.snp.bottom).offset(135) - $0.centerX.equalTo(self.view.snp.centerX) - $0.height.equalTo(223) - $0.width.equalTo(246) - } - } + noSearchImageView.isHidden = false } override func touchesBegan(_ touches: Set, with event: UIEvent?) { @@ -170,17 +172,22 @@ class StudioMapSearchViewController: UIViewController { @objc func textFieldDidChange(textField: UITextField) { clearButton.isHidden = (searchPlaceTextField.text?.isEmpty) ?? true magnifyingGlassButton.isHidden = !(clearButton.isHidden) - + if !(searchPlaceTextField.text?.isEmpty ?? true) { + searchStudiosWithAPI(keyword: searchPlaceTextField.text ?? "") + changeEmptySearchView() + } else { + noSearchImageView.isHidden = true + } } @objc func touchSearchButton(_ sender: UIButton) { self.view.endEditing(true) - changeEmptySearchView() /// (임시로 실행) 토큰 나오면 이 줄 삭제하기 - searchStudiosWithAPI(keyword: searchPlaceTextField.text ?? "") + changeEmptySearchView() } @objc func touchClearButton(_ sender: UIButton) { searchPlaceTextField.text = "" + noSearchImageView.isHidden = true magnifyingGlassButton.isHidden = false clearButton.isHidden = true } From 9ccbc42c5b0756f84da0974875105daa02f73000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 21:52:24 +0900 Subject: [PATCH 04/17] =?UTF-8?q?=E2=9E=95[ADD]=20#146=20-=20Asset=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../btnScrapActive.imageset/Contents.json | 23 ++++++++++++++++++ .../btnScrapActive.png | Bin 0 -> 301 bytes .../btnScrapActive@2x.png | Bin 0 -> 487 bytes .../btnScrapActive@3x.png | Bin 0 -> 680 bytes .../Constants/Assets+Generated.swift | 1 + 5 files changed, 24 insertions(+) create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/Contents.json create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive.png create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive@2x.png create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive@3x.png diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/Contents.json b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/Contents.json new file mode 100644 index 0000000..66849cc --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "btnScrapActive.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btnScrapActive@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btnScrapActive@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive.png b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5374e59d9911513e33cb48ec2b4b8d9f1ee6bc GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zWWYz7UCJP8cUlNgv572E%k7E)sVQ=ukybeGxB!?(CQCNkv3?EY92`tthi_v^kZ ziwg3-IL>XpuKoJT4vmKY_vRl97Ff*q{$pxEO~(c%bsx?T`B(ePljq$Jb33Zg^fS3K s`jl~pDf`MvecyaFMTI_d6#Ty&0b(8xyofTEAY|wumcly|=4}b5!FLw2iKJf78 zuD^T!zke6Ixu-Mo%qmw?OOXg{pIaz1T~e8@F$!(Y^2P{9JGIB5?9* z_Z|*MW}d_U?>%S{Q+C?G@OW+RnuqQSm037H82_>P^+CDwf&8Lt91or_6q&R=tX6p< zzvxwfpxVUmtYxboan8)m@3uObP0 Hl+XkKh^)fT literal 0 HcmV?d00001 diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive@3x.png b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnScrapActive.imageset/btnScrapActive@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0849ee0133c6247ead127de0d27ef555fbf02b GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9FJK(?X*8o|0J?9FfiGAx;TbZFuuKeu<&w#K>NqqzSAFCI}gXI zE@@!0V|?-8|&2uNh+X^!20ufG0$eg5tI_;Z(bc}}Z~Fi>Rv@j?IF-**rH$8Eiv zIQ5*~Vpk6F2liZAE;RO|N4jYi%KmV4-U&riv6|o-;C@2f`4XRhJD`d4g;ws~_hrb1L{RI@Awld1`?BATe!q#ajOgej`POMF7dBgaRr(QPg zhjG7wUGt7@XEw2YSezkMx1;@OUJctuZNbFCf6jT|!)N=KDZRUwSGKTj&bxP6n>PzT f7UTg%wZMJ-ox$gp_ Date: Thu, 19 Jan 2023 21:53:11 +0900 Subject: [PATCH 05/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#146=20-=20=EC=98=B5?= =?UTF-8?q?=EC=85=94=EB=84=90=20=EC=96=B8=EB=9E=98=ED=95=91=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StudioMapSearchViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift index 4ed1c5f..9b799a5 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapSearchViewController/StudioMapSearchViewController.swift @@ -259,7 +259,8 @@ extension StudioMapSearchViewController { case .success(let data): if let search = data as? StudioSearchResponse { self.serverSearchStudios = search - if ((self.serverSearchStudios?.studios.isEmpty) != nil) { + guard let isEmptyStudios = self.serverSearchStudios?.studios.isEmpty else { return } + if isEmptyStudios { self.changeEmptySearchView() } else { self.tableView.reloadData() From d436aba34c26e1500c2786909ed31465081a5398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 21:53:34 +0900 Subject: [PATCH 06/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#146=20-=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnboardingViewController.swift | 2 +- .../StudioMapContentViewController.swift | 53 ++-- .../StudioMapViewController.swift | 256 +++++++----------- 3 files changed, 126 insertions(+), 185 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/OnboardingViewController/OnboardingViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/OnboardingViewController/OnboardingViewController.swift index 7d25935..50e452c 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/OnboardingViewController/OnboardingViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/OnboardingViewController/OnboardingViewController.swift @@ -146,7 +146,7 @@ extension OnboardingViewController: UICollectionViewDelegate, UICollectionViewDa func scrollViewDidScroll(_ scrollView: UIScrollView) { let width = scrollView.frame.width - currentPage = lroundl(scrollView.contentOffset.x / width) + currentPage = lroundl(Float80(scrollView.contentOffset.x / width)) } } diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapBottomSheetViewController/StudioMapContentViewController/StudioMapContentViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapBottomSheetViewController/StudioMapContentViewController/StudioMapContentViewController.swift index 0098d62..d66d3ad 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapBottomSheetViewController/StudioMapContentViewController/StudioMapContentViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapBottomSheetViewController/StudioMapContentViewController/StudioMapContentViewController.swift @@ -27,9 +27,12 @@ class StudioMapContentViewController: UIViewController { let timeLabel = UILabel() let callLabel = UILabel() let priceLabel = UILabel() - let linkButton = UIButton() let photoReviewLabel = UILabel() let underlineView = UIView() + var linkButton = UIButton().then { + $0.titleLabel?.font = .body1 + } + var selectedStudioInfo = StudioInfo(id: 0, name: "필린 사진관", address: "솝트시 앱잼구 필린로", price: "3000원", time: "11:00-12:00", tel: "010-0000-0000", lati: 0, long: 0, etc: "많관부~", isDeleted: false, site: "https://www.naver.com/") let studioCollectionview: UICollectionView = { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .vertical @@ -42,14 +45,15 @@ class StudioMapContentViewController: UIViewController { // MARK: - View Cycle override func viewDidLoad() { super.viewDidLoad() + setupAttribute() setupUI() register() - studioPhotosWithAPI(studioID: StudioMapViewController.selectedMarkerID ?? 0) + studioPhotosWithAPI(studioID: selectedStudioInfo.id ?? 0) } override func viewDidAppear(_ animated: Bool) { - studioPhotosWithAPI(studioID: StudioMapViewController.selectedMarkerID ?? 0) + studioPhotosWithAPI(studioID: selectedStudioInfo.id ?? 0) } // MARK: - Func @@ -89,7 +93,7 @@ class StudioMapContentViewController: UIViewController { } // Label view.add(studioLabel) { - $0.text = StudioMapViewController.name + $0.text = self.selectedStudioInfo.name $0.textColor = .white $0.font = .headline $0.snp.makeConstraints { @@ -100,11 +104,13 @@ class StudioMapContentViewController: UIViewController { } view.add(scrapButton) { $0.setImage(Asset.btnScrap.image, for: .normal) + $0.setImage(Asset.btnScrapActive.image, for: .selected) $0.snp.makeConstraints { $0.top.equalTo(self.view.snp.top).offset(36) $0.trailing.equalTo(self.view.snp.trailing).offset(-18) $0.width.height.equalTo(32) } + $0.addTarget(self, action: #selector(self.scrapButtonDidTap), for: .touchUpInside) } studioScrollContainverView.add(firstdividerView) { $0.backgroundColor = .darkGrey3 @@ -117,10 +123,10 @@ class StudioMapContentViewController: UIViewController { } // Label studioScrollContainverView.add(locationLabel) { - if StudioMapViewController.address == nil { + if self.selectedStudioInfo.address == nil { $0.text = "등록된 주소가 없습니다." } else { - $0.text = StudioMapViewController.address + $0.text = self.selectedStudioInfo.address } $0.numberOfLines = 0 $0.font = .body2 @@ -133,10 +139,10 @@ class StudioMapContentViewController: UIViewController { } } studioScrollContainverView.add(timeLabel) { - if StudioMapViewController.time == nil { + if self.selectedStudioInfo.time == nil { $0.text = "등록된 운영시간이 없습니다." } else { - $0.text = StudioMapViewController.time + $0.text = self.selectedStudioInfo.time } $0.numberOfLines = 0 $0.font = .body2 @@ -149,10 +155,10 @@ class StudioMapContentViewController: UIViewController { } } studioScrollContainverView.add(callLabel) { - if StudioMapViewController.tel == nil { + if self.selectedStudioInfo.tel == nil { $0.text = "등록된 전화번호가 없습니다." } else { - $0.text = StudioMapViewController.tel + $0.text = self.selectedStudioInfo.tel } $0.numberOfLines = 0 $0.font = .body2 @@ -165,10 +171,10 @@ class StudioMapContentViewController: UIViewController { } } studioScrollContainverView.add(priceLabel) { - if StudioMapViewController.price == nil { + if self.selectedStudioInfo.price == nil { $0.text = "등록된 가격정보가 없습니다." } else { - $0.text = StudioMapViewController.price + $0.text = self.selectedStudioInfo.price } $0.numberOfLines = 0 $0.font = .body2 @@ -181,13 +187,7 @@ class StudioMapContentViewController: UIViewController { } } studioScrollContainverView.add(linkButton) { - $0.titleLabel?.font = .body1 - $0.snp.makeConstraints { - $0.top.equalTo(self.priceLabel.snp.bottom).offset(18) - $0.leading.equalTo(self.studioScrollContainverView.snp.leading).offset(48) - $0.height.equalTo(18) - } - if StudioMapViewController.site == nil { + if self.selectedStudioInfo.site == nil { $0.setTitle("웹사이트가 없습니다 ", for: .normal) $0.setTitleColor(.grey4, for: .normal) } else { @@ -195,6 +195,11 @@ class StudioMapContentViewController: UIViewController { $0.setTitleColor(.fillinRed, for: .normal) self.linkButton.addTarget(self, action: #selector(self.touchLinkButton), for: .touchUpInside) } + $0.snp.makeConstraints { + $0.top.equalTo(self.priceLabel.snp.bottom).offset(18) + $0.leading.equalTo(self.studioScrollContainverView.snp.leading).offset(48) + $0.height.equalTo(18) + } } // 아이콘 studioScrollContainverView.add(locationImageView) { @@ -244,7 +249,7 @@ class StudioMapContentViewController: UIViewController { $0.leading.equalTo(self.linkButton.snp.leading) $0.height.equalTo(1) } - if StudioMapViewController.site == nil { + if self.selectedStudioInfo.site == nil { $0.backgroundColor = .grey4 $0.snp.makeConstraints { $0.width.equalTo(106) @@ -289,13 +294,15 @@ class StudioMapContentViewController: UIViewController { // MARK: - @objc @objc func touchLinkButton() { - let studioUrl = NSURL(string: StudioMapViewController.site ?? "none site") + let studioUrl = NSURL(string: selectedStudioInfo.site ?? "none site") let studioSafariView: SFSafariViewController = SFSafariViewController(url: studioUrl! as URL) self.present(studioSafariView, animated: true, completion: nil) } - + @objc func scrapButtonDidTap(_ sender: UIButton) { + sender.isSelected.toggle() + } @objc func notiStudioPhotoswithAPI(_ notification: Notification) { - studioPhotosWithAPI(studioID: StudioMapViewController.selectedMarkerID ?? 0) + studioPhotosWithAPI(studioID: selectedStudioInfo.id ?? 0) } } diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift index f0b3c9e..ebcf163 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift @@ -7,14 +7,14 @@ import UIKit -import NMapsMap -import CoreLocation import SnapKit import Then +import NMapsMap +import CoreLocation import MapKit class StudioMapViewController: UIViewController { - + // MARK: - Properties (BottomSheet) enum BottomSheetViewState { case expanded @@ -23,48 +23,34 @@ class StudioMapViewController: UIViewController { private let contentViewController: UIViewController private var bottomSheetViewTopConstraint: NSLayoutConstraint! - var bottomSheetPanMinTopConstant: CGFloat = 50.0 - var bottomHeight: CGFloat = UIScreen.main.bounds.size.height*(3/7) - let defaultHeight: CGFloat = UIScreen.main.bounds.size.height*(3/7) + private let bottomSheetPanMinTopConstant: CGFloat = 50.0 + private var bottomHeight: CGFloat = UIScreen.main.bounds.size.height*(3/7) + private let defaultHeight: CGFloat = UIScreen.main.bounds.size.height*(3/7) private lazy var bottomSheetPanStartingTopConstant: CGFloat = bottomSheetPanMinTopConstant - let bottomSheetView: UIView = { - let view = UIView() - view.backgroundColor = .darkGrey2 - - return view - }() + let bottomSheetView = UIView().then { + $0.backgroundColor = .darkGrey2 + } - private let dismissIndicatorView: UIView = { - let view = UIView() - view.backgroundColor = .darkGrey1 - view.layer.cornerRadius = 3 - - return view - }() + private let dismissIndicatorView = UIView().then { + $0.backgroundColor = .darkGrey1 + $0.layer.cornerRadius = 3 + } // MARK: - Properties - static var name: String? - static var address: String? - static var time: String? - static var tel: String? - static var price: String? - static var site: String? - static var selectedMarkerID: Int? - static var lati: Double? - static var long: Double? - - var serverStudioInfo: StudioInfoResponse? - var serverStudios: StudioResponse? + var serverStudioInfo = StudioInfoResponse(studio: StudioInfo(id: 0, name: "", address: "", price: "", time: "", tel: "", lati: 0, long: 0, etc: "", isDeleted: false, site: "")) + var serverStudios = StudioResponse(studios: []) + var selectedMarkerInfo = Studio(id: 0, lati: 0, long: 0) var selectedMarker: NMFMarker? - var selectedMarkerInfo: Studio? - let mapView = NMFNaverMapView(frame: .zero) - let myLocationButton = UIButton() - let dataSource = NMFInfoWindowDefaultTextSource.data() - let magnifyingGlassButton = UIButton().then { + var locationManager = CLLocationManager() + + // MARK: - UI Properties + private let navigationBar = FilinNavigationBar() + private let mapView = NMFNaverMapView(frame: .zero) + private let magnifyingGlassButton = UIButton().then { $0.setImage(Asset.icnSearch.image, for: .normal) } - let searchPlaceTextField = UITextField().then { + private lazy var searchPlaceTextField = UITextField().then { $0.backgroundColor = .darkGrey2 $0.layer.borderColor = UIColor.fillinRed.cgColor $0.layer.borderWidth = 1 @@ -72,26 +58,20 @@ class StudioMapViewController: UIViewController { $0.font = .body2 $0.setPlaceHolder() $0.addLeftPadding() + $0.addTarget(self, action: #selector(textFieldDidBeginEditing(_:)), for: .touchDown) + } + private lazy var myLocationButton = UIButton().then { + $0.setImage(Asset.icnMyLocation.image, for: .normal) + $0.addTarget(self, action: #selector(touchLocationButton), for: .touchUpInside) } - var clickCount = 0 - var locationManager = CLLocationManager() - let navigationBar = FilinNavigationBar() // MARK: - View Life Cycle override func viewDidLoad() { super.viewDidLoad() - setUpMapView() - setUpNavigationBar() - layoutMapView() - layoutMyLocationButton() - layoutSearchView() - layoutNavigaionBar() - getBottomSheetInfo() + + setAttribute() + setLayout() totalStudioWithAPI() - setLatLngNotification() - tmpSetupMarker() - setupBottomSheetUI() - setupBottomSheetGestureRecognizer() } // MARK: - init @@ -106,48 +86,33 @@ class StudioMapViewController: UIViewController { } // MARK: - Extensions + extension StudioMapViewController { + private func setAttribute() { + tmpSetupMarker() + setUpMapView() + setUpBottomSheetUI() + setUpMarkerInfo() + setUpNavigationBar() + setUpBottomSheetGestureRecognizer() + setLatLngNotification() + } - /// 서버 부활되기 전까지 현상소 관련 기능 테스트할 임시 함수 (네이버 그린팩토리에 현상소 표시해줌) - func tmpSetupMarker() { - let markertmp = NMFMarker(position: NMGLatLng(lat: 37.35940010181669, lng: 127.10475679570187)) + private func tmpSetupMarker() { + let markertmp = NMFMarker(position: NMGLatLng(lat: 37.556393, lng: 126.9716552)) markertmp.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) markertmp.mapView = self.mapView.mapView - - let secondMarkertmp = NMFMarker(position: NMGLatLng(lat: 37.36161841308457, lng: 127.10566240106306)) - secondMarkertmp.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) - secondMarkertmp.mapView = self.mapView.mapView - - secondMarkertmp.touchHandler = { [weak self] (overlay: NMFOverlay) -> Bool in - if self?.selectedMarker == nil { /// 클릭했던 현상소가 없는 경우 (지도뷰 처음 들어올 떄) - self?.selectedMarker = secondMarkertmp - self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) - self?.showBottomSheet() - } else { - if self?.selectedMarker == secondMarkertmp { /// 클릭했던 현상소를 다시 클릭하는 경우 - self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) - self?.hideBottomSheetAndGoBack() - } else { /// 다른 현상소 클릭 - self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) - self?.selectedMarker = secondMarkertmp - self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) - self?.showBottomSheet() - } - } - return true - } - - markertmp.touchHandler = { [weak self] (overlay: NMFOverlay) -> Bool in - if self?.selectedMarker == nil { /// 클릭했던 현상소가 없는 경우 (지도뷰 처음 들어올 떄) + markertmp.touchHandler = { [weak self] (_: NMFOverlay) -> Bool in + if self?.selectedMarker == nil { self?.selectedMarker = markertmp self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) self?.showBottomSheet() } else { - if self?.selectedMarker == markertmp { /// 클릭했던 현상소를 다시 클릭하는 경우 + if self?.selectedMarker == markertmp { self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) self?.selectedMarker = nil self?.hideBottomSheetAndGoBack() - } else { /// 다른 현상소 클릭 + } else { self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) self?.selectedMarker = markertmp self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) @@ -172,30 +137,29 @@ extension StudioMapViewController { locationManager.delegate = self self.locationManager.requestWhenInUseAuthorization() } - + private func setUpMarkerInfo() { self.mapView.mapView.touchDelegate = self - serverStudios?.studios.forEach { + serverStudios.studios.forEach { let marker = NMFMarker(position: NMGLatLng(lat: $0.lati, lng: $0.long)) let markerInfo = Studio(id: $0.id, lati: $0.lati, long: $0.long) marker.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) - self.selectedMarkerInfo = markerInfo - StudioMapViewController.selectedMarkerID = markerInfo.id - self.studioInfoWithAPI(studioID: markerInfo.id) + selectedMarkerInfo = markerInfo + studioInfoWithAPI(studioID: markerInfo.id) - marker.touchHandler = { [weak self] (overlay: NMFOverlay) -> Bool in - if self?.selectedMarker == nil { /// 클릭했던 현상소가 없는 경우 (지도뷰 처음 들어올 떄) + marker.touchHandler = { [weak self] (_: NMFOverlay) -> Bool in + if self?.selectedMarker == nil { self?.selectedMarker = marker self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) self?.showBottomSheet() } else { - if self?.selectedMarker == marker { /// 클릭했던 현상소를 다시 클릭하는 경우 + if self?.selectedMarker == marker { self?.selectedMarker = nil self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) self?.hideBottomSheetAndGoBack() - } else { /// 다른 현상소 클릭 + } else { self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudio.image) self?.selectedMarker = marker self?.selectedMarker?.iconImage = NMFOverlayImage(image: Asset.icnStudioSelected.image) @@ -208,88 +172,67 @@ extension StudioMapViewController { } } - func getBottomSheetInfo() { - StudioMapViewController.name = "필린 현상소" - StudioMapViewController.address = "솝트시 앱잼구 필린동 아요로 12번길 13" - StudioMapViewController.time = "open 00:00-24:00" - StudioMapViewController.tel = "010-1234-5678" - StudioMapViewController.price = "컬러 5000000000원" - StudioMapViewController.site = "" - -// StudioMapViewController.name = self.serverStudioInfo?.studio.name -// StudioMapViewController.address = self.serverStudioInfo?.studio.address -// StudioMapViewController.time = self.serverStudioInfo?.studio.time -// StudioMapViewController.tel = self.serverStudioInfo?.studio.tel -// StudioMapViewController.price = self.serverStudioInfo?.studio.price -// StudioMapViewController.site = self.serverStudioInfo?.studio.site - } - private func setUpNavigationBar() { self.navigationController?.navigationBar.isHidden = true navigationBar.popViewController = { self.navigationController?.popViewController(animated: true) } } + + private func setLatLngNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(getLatLng(_:)), name: Notification.Name("GetLatLng"), object: nil) + } +} + +extension StudioMapViewController { + private func setLayout() { + layoutMapView() + layoutMyLocationButton() + layoutSearchView() + layoutNavigaionBar() + view.bringSubviewToFront(bottomSheetView) + view.bringSubviewToFront(dismissIndicatorView) + } private func layoutMapView() { mapView.snp.makeConstraints { - $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top) - $0.leading.equalTo(self.view.safeAreaLayoutGuide.snp.leading) - $0.bottom.equalTo(self.view.snp.bottom) - $0.trailing.equalTo(self.view.safeAreaLayoutGuide.snp.trailing) + $0.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.bottom.equalToSuperview() } } private func layoutMyLocationButton() { view.addSubview(myLocationButton) - myLocationButton.setImage(Asset.icnMyLocation.image, for: .normal) myLocationButton.snp.makeConstraints { $0.trailing.equalToSuperview().offset(-20) $0.bottom.equalToSuperview().offset(-48) } - myLocationButton.addTarget(self, action: #selector(touchLocationButton), for: .touchUpInside) } private func layoutSearchView() { - view.addSubview(searchPlaceTextField) - view.addSubview(magnifyingGlassButton) + view.addSubviews([searchPlaceTextField, magnifyingGlassButton]) + searchPlaceTextField.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide).inset(68) + $0.leading.trailing.equalToSuperview().inset(18) + $0.height.equalTo(48) + } magnifyingGlassButton.snp.makeConstraints { - $0.top.equalTo(searchPlaceTextField).inset(11) - $0.leading.equalTo(searchPlaceTextField).inset(295) - $0.bottom.equalTo(searchPlaceTextField).inset(11) + $0.centerY.equalTo(searchPlaceTextField) $0.trailing.equalTo(searchPlaceTextField).inset(18) } - searchPlaceTextField.snp.makeConstraints { - $0.top.equalTo(self.view.safeAreaLayoutGuide).inset(68) - $0.leading.equalTo(self.view).inset(18) - $0.trailing.equalTo(self.view).inset(18) - $0.size.height.equalTo(48) - } - searchPlaceTextField.addTarget(self, action: #selector(textFieldDidBeginEditing(_:)), for: .touchDown) } func layoutNavigaionBar() { - view.add(navigationBar) { - self.navigationBar.popViewController = { - self.navigationController?.popViewController(animated: true) - } - $0.snp.makeConstraints { - $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top) - $0.leading.trailing.equalToSuperview() - $0.height.equalTo(50) - } + view.add(navigationBar) + navigationBar.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(50) } } - func setLatLngNotification() { - NotificationCenter.default.addObserver(self, selector: #selector(getLatLng(_:)), name: Notification.Name("GetLatLng"), object: nil) - } - // MARK: - @objc @objc func getLatLng(_ notification: Notification) { let selectedStudioId = notification.object as? Int ?? 0 studioInfoWithAPI(studioID: selectedStudioId) - - let cameraUpdate = NMFCameraUpdate(scrollTo: NMGLatLng(lat: StudioMapViewController.lati ?? 0, lng: StudioMapViewController.long ?? 0)) - mapView.mapView.moveCamera(cameraUpdate) } @objc func textFieldDidBeginEditing(_ textField: UITextField) { @@ -298,9 +241,9 @@ extension StudioMapViewController { newVC.modalPresentationStyle = .fullScreen self.present(newVC, animated: true, completion: nil) } - + @objc func touchLocationButton(_ sender: UIButton) { - sender.isSelected = !sender.isSelected + sender.isSelected.toggle() mapView.mapView.positionMode = .direction } } @@ -324,7 +267,6 @@ extension UITextField { // MARK: - Extension - CLLocationManagerDelegate extension StudioMapViewController: CLLocationManagerDelegate { - func getLocationUsagePermission() { self.locationManager.requestWhenInUseAuthorization() } @@ -371,19 +313,13 @@ extension StudioMapViewController { } } } -} - -extension StudioMapViewController { func studioInfoWithAPI(studioID: Int) { StudioMapAPI.shared.infoStudio(studioID: studioID) { response in switch response { case .success(let data): if let studioinfo = data as? StudioInfoResponse { self.serverStudioInfo = studioinfo - StudioMapViewController.lati = studioinfo.studio.lati - StudioMapViewController.long = studioinfo.studio.long - - let cameraUpdate = NMFCameraUpdate(scrollTo: NMGLatLng(lat: StudioMapViewController.lati ?? 0, lng: StudioMapViewController.long ?? 0)) + let cameraUpdate = NMFCameraUpdate(scrollTo: NMGLatLng(lat: studioinfo.studio.lati ?? 0, lng: studioinfo.studio.long ?? 0)) self.mapView.mapView.moveCamera(cameraUpdate) NotificationCenter.default.post(name: Notification.Name.studioPhotoswithAPI, object: nil) self.showBottomSheet() @@ -401,31 +337,30 @@ extension StudioMapViewController { } } -// MARK: - Extension - BottomSheet +// MARK: - BottomSheet extension StudioMapViewController { - - private func setupBottomSheetUI() { + private func setUpBottomSheetUI() { addChild(contentViewController) bottomSheetView.addSubview(contentViewController.view) contentViewController.didMove(toParent: self) view.addSubviews([bottomSheetView, dismissIndicatorView]) - + let viewPan = UIPanGestureRecognizer(target: self, action: #selector(viewPanned(_:))) viewPan.delaysTouchesBegan = false viewPan.delaysTouchesEnded = false view.addGestureRecognizer(viewPan) - setupBottomSheetLayout() + setUpBottomSheetLayout() } - private func setupBottomSheetGestureRecognizer() { + private func setUpBottomSheetGestureRecognizer() { let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(panGesture)) swipeGesture.direction = .down view.addGestureRecognizer(swipeGesture) } - private func setupBottomSheetLayout() { + private func setUpBottomSheetLayout() { contentViewController.view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ contentViewController.view.topAnchor.constraint(equalTo: bottomSheetView.topAnchor), @@ -454,7 +389,6 @@ extension StudioMapViewController { } private func showBottomSheet(atState: BottomSheetViewState = .normal) { - getBottomSheetInfo() if atState == .normal { changeScrollDisabled() let safeAreaHeight: CGFloat = view.safeAreaLayoutGuide.layoutFrame.height @@ -479,13 +413,13 @@ extension StudioMapViewController { self.view.layoutIfNeeded() }) } - + func nearest(to number: CGFloat, inValues values: [CGFloat]) -> CGFloat { guard let nearestVal = values.min(by: { abs(number - $0) < abs(number - $1) }) else { return number } return nearestVal } - + func changeScrollEnabled() { let contentVC = children.first as? StudioMapContentViewController contentVC?.studioScrollview.isScrollEnabled = true From ba7e7ae2e3f780e4de7e23f2912beb009063c10a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 23:16:01 +0900 Subject: [PATCH 07/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=9E=A9=ED=95=9C=20=EC=8A=A4=ED=8A=9C=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Fillin-iOS.xcodeproj/project.pbxproj | 32 +++++++++++++++++++ .../DataModel/likedStudiosResponse.swift | 18 +++++++++++ 2 files changed, 50 insertions(+) create mode 100644 Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/DataModel/likedStudiosResponse.swift diff --git a/Fillin-iOS/Fillin-iOS.xcodeproj/project.pbxproj b/Fillin-iOS/Fillin-iOS.xcodeproj/project.pbxproj index 271b131..5bbd9f8 100644 --- a/Fillin-iOS/Fillin-iOS.xcodeproj/project.pbxproj +++ b/Fillin-iOS/Fillin-iOS.xcodeproj/project.pbxproj @@ -103,6 +103,10 @@ 6F8B71F92796F33A00F88EB3 /* StudioResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8B71F82796F33A00F88EB3 /* StudioResponse.swift */; }; 6F8B72012797291300F88EB3 /* StudioInfoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8B72002797291300F88EB3 /* StudioInfoResponse.swift */; }; 6F9365872799856A0037557F /* StudioSearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F9365862799856A0037557F /* StudioSearchResponse.swift */; }; + 6FBCF99E2979758A00047445 /* likedStudiosViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBCF99C2979758A00047445 /* likedStudiosViewController.swift */; }; + 6FBCF99F2979758A00047445 /* likedStudiosViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6FBCF99D2979758A00047445 /* likedStudiosViewController.xib */; }; + 6FBCF9A12979797F00047445 /* LikedStudiosCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBCF9A02979797F00047445 /* LikedStudiosCollectionViewCell.swift */; }; + 6FBCF9A429797AF800047445 /* likedStudiosResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBCF9A329797AF800047445 /* likedStudiosResponse.swift */; }; 770CB4632799E550006004BB /* LoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 770CB4622799E550006004BB /* LoginResponse.swift */; }; 775C965E278ACDE200A9BEA0 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 775C965D278ACDE200A9BEA0 /* .swiftlint.yml */; }; 775C96AA278B2E1100A9BEA0 /* swiftgen.yml in Resources */ = {isa = PBXBuildFile; fileRef = 775C96A9278B2E1100A9BEA0 /* swiftgen.yml */; }; @@ -231,6 +235,10 @@ 6F8B71F82796F33A00F88EB3 /* StudioResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudioResponse.swift; sourceTree = ""; }; 6F8B72002797291300F88EB3 /* StudioInfoResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudioInfoResponse.swift; sourceTree = ""; }; 6F9365862799856A0037557F /* StudioSearchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudioSearchResponse.swift; sourceTree = ""; }; + 6FBCF99C2979758A00047445 /* likedStudiosViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = likedStudiosViewController.swift; sourceTree = ""; }; + 6FBCF99D2979758A00047445 /* likedStudiosViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = likedStudiosViewController.xib; sourceTree = ""; }; + 6FBCF9A02979797F00047445 /* LikedStudiosCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikedStudiosCollectionViewCell.swift; sourceTree = ""; }; + 6FBCF9A329797AF800047445 /* likedStudiosResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = likedStudiosResponse.swift; sourceTree = ""; }; 770CB4622799E550006004BB /* LoginResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginResponse.swift; sourceTree = ""; }; 775C9645278ACBEA00A9BEA0 /* Fillin-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fillin-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 775C965D278ACDE200A9BEA0 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; @@ -537,6 +545,8 @@ 6F3B872827968AEB00A4BD07 /* MyPageViewController */ = { isa = PBXGroup; children = ( + 6FBCF9A229797AE600047445 /* DataModel */, + 6FBCF99B2979754400047445 /* likedStudiosViewController */, 6F3B872927968AEB00A4BD07 /* MyPagePhotoCollectionViewCell.swift */, 6F3B872A27968AEB00A4BD07 /* MyPageViewController.xib */, 6F3B872B27968AEB00A4BD07 /* MyPageViewController.swift */, @@ -768,6 +778,24 @@ path = DataModel; sourceTree = ""; }; + 6FBCF99B2979754400047445 /* likedStudiosViewController */ = { + isa = PBXGroup; + children = ( + 6FBCF99C2979758A00047445 /* likedStudiosViewController.swift */, + 6FBCF99D2979758A00047445 /* likedStudiosViewController.xib */, + 6FBCF9A02979797F00047445 /* LikedStudiosCollectionViewCell.swift */, + ); + path = likedStudiosViewController; + sourceTree = ""; + }; + 6FBCF9A229797AE600047445 /* DataModel */ = { + isa = PBXGroup; + children = ( + 6FBCF9A329797AF800047445 /* likedStudiosResponse.swift */, + ); + path = DataModel; + sourceTree = ""; + }; 775C963C278ACBEA00A9BEA0 = { isa = PBXGroup; children = ( @@ -934,6 +962,7 @@ files = ( 6F3B877E27968AEB00A4BD07 /* NotoSansKR-Medium.otf in Resources */, 6F3B87A027968AEB00A4BD07 /* SplashViewController.xib in Resources */, + 6FBCF99F2979758A00047445 /* likedStudiosViewController.xib in Resources */, 775C965E278ACDE200A9BEA0 /* .swiftlint.yml in Resources */, 6F3B87C627968AEB00A4BD07 /* PhotosTableViewCell.xib in Resources */, 6F3B87B727968AEB00A4BD07 /* FilmCurationFirstCollectionViewCell.xib in Resources */, @@ -1100,10 +1129,12 @@ 6F3B87E027968D3000A4BD07 /* StudioMapContentViewController.swift in Sources */, 6F3B87C227968AEB00A4BD07 /* PhotosCollectionViewCell.swift in Sources */, 77EB42232797D1CE00C726D8 /* FilmSelectService.swift in Sources */, + 6FBCF99E2979758A00047445 /* likedStudiosViewController.swift in Sources */, 6F3B879B27968AEB00A4BD07 /* StudioMapSearchViewController.swift in Sources */, 6F3B879327968AEB00A4BD07 /* StudioMapAPI.swift in Sources */, 6F3B877027968AEB00A4BD07 /* Assets+Generated.swift in Sources */, E89934FD27CD2BCB00DCB1A8 /* OnboardingCollectionViewCell.swift in Sources */, + 6FBCF9A429797AF800047445 /* likedStudiosResponse.swift in Sources */, 6F3B877127968AEB00A4BD07 /* Xib.swift in Sources */, 6F3B87A827968AEB00A4BD07 /* FirstAddPhotoPopUpViewController.swift in Sources */, 6F3B879027968AEB00A4BD07 /* MyPageAPI.swift in Sources */, @@ -1140,6 +1171,7 @@ 6F3B877927968AEB00A4BD07 /* UIColor+Extension.swift in Sources */, 6F3B87C827968AEB00A4BD07 /* MapTableViewCell.swift in Sources */, 6F3B87E127968D3000A4BD07 /* StudioMapCollectionViewCell.swift in Sources */, + 6FBCF9A12979797F00047445 /* LikedStudiosCollectionViewCell.swift in Sources */, 6F3B87C927968AEB00A4BD07 /* WelcomeTableViewCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/DataModel/likedStudiosResponse.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/DataModel/likedStudiosResponse.swift new file mode 100644 index 0000000..bfcedee --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/DataModel/likedStudiosResponse.swift @@ -0,0 +1,18 @@ +// +// likedStudios.swift +// Fillin-iOS +// +// Created by 임주민 on 2023/01/19. +// + +import Foundation + +struct LikedStudiosResponse: Codable { + let likedStudios: [LikedStudio] +} + +// MARK: - Studio +struct LikedStudio: Codable { + let id: Int + let name, address: String +} From 2efcfabc91edad01b38a5b552ddcdfbea99d0f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 23:16:34 +0900 Subject: [PATCH 08/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=9E=A9=ED=95=9C=20=EC=8A=A4=ED=8A=9C=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=AA=A8=EC=95=84=EB=B3=B4=EB=8A=94=EB=B7=B0=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 130 ++++++++++++++++++ .../likedStudiosViewController.xib | 22 +++ 2 files changed, 152 insertions(+) create mode 100644 Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift create mode 100644 Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.xib diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift new file mode 100644 index 0000000..9215f93 --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -0,0 +1,130 @@ +// +// likedStudiosViewController.swift +// Fillin-iOS +// +// Created by 임주민 on 2023/01/19. +// + +import UIKit + +import SnapKit +import Then + +final class LikedStudiosViewController: UIViewController { + // MARK: - Properties + var likedStudiosList: [LikedStudio] = [] + + // MARK: - UI Properties + private let navigationBar = FilinNavigationBar() + + private lazy var studiosCollectionView: UICollectionView = { + let layout = UICollectionViewFlowLayout() + + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) + collectionView.isScrollEnabled = true + collectionView.backgroundColor = .black + + return collectionView + }() + + // MARK: - Life Cycle + override func viewDidLoad() { + super.viewDidLoad() + + setAttribute() + setLayout() + setDummyData() + } + + // MARK: - @objc + + // MARK: - Custom Method + private func setDummyData() { + for _ in 0..<20 { + likedStudiosList.append(contentsOf: [LikedStudio(id: 0, name: "필린 사진관", address: "서울특별시 영등포구 여의도동21-3 가가가가가가가가가가가가가가가가")]) + } + } +} + +// MARK: - Attribute +extension LikedStudiosViewController { + private func setAttribute() { + setUpNavigationBar() + registerCell() + setDelegate() + } + + private func setUpNavigationBar() { + self.navigationController?.navigationBar.isHidden = true + navigationBar.popViewController = { self.navigationController?.popViewController(animated: true) } + } + + private func registerCell() { + studiosCollectionView.register(LikedStudiosCollectionViewCell.self, forCellWithReuseIdentifier: LikedStudiosCollectionViewCell.identifier) + } + + private func setDelegate() { + studiosCollectionView.delegate = self + studiosCollectionView.dataSource = self + } +} + +// MARK: - Layout +extension LikedStudiosViewController { + private func setLayout() { + layoutNavigaionBar() + layoutStudiosCollectionView() + } + + private func layoutNavigaionBar() { + view.add(navigationBar) + navigationBar.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(50) + } + } + + private func layoutStudiosCollectionView() { + view.add(studiosCollectionView) + studiosCollectionView.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.bottom.trailing.equalToSuperview() + } + } +} + +// MARK: - UICollectionViewDelegate +extension LikedStudiosViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + print(indexPath.row) + // let studioMapViewController = StudioMapViewController(contentViewController: <#UIViewController#>) + // detailMyDiaryViewController.diaryId = diaryList[indexPath.row].diaryId + // self.navigationController?.pushViewController(studioMapViewController, animated: true) + } +} + +// MARK: - UICollectionViewDataSource +extension LikedStudiosViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return likedStudiosList.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LikedStudiosCollectionViewCell.identifier, for: indexPath) as? LikedStudiosCollectionViewCell else { return UICollectionViewCell() } + let studioName = likedStudiosList[indexPath.row].name + let studioAddress = likedStudiosList[indexPath.row].address + cell.setData(studioName: studioName, studioAddress: studioAddress) + + return cell + } +} + +// MARK: - UICollectionViewDelegateFlowLayout +extension LikedStudiosViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let cellSize = CGSize(width: UIScreen.main.bounds.width, height: 85) + + return cellSize + } +} diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.xib b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.xib new file mode 100644 index 0000000..c2ab4de --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.xib @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From 370f90e5b633b9a9545038e3571d33f6b6852d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 23:16:49 +0900 Subject: [PATCH 09/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EC=BD=9C?= =?UTF-8?q?=EB=A0=89=EC=85=98=EB=B7=B0=20=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 --- .../LikedStudiosCollectionViewCell.swift | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/LikedStudiosCollectionViewCell.swift diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/LikedStudiosCollectionViewCell.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/LikedStudiosCollectionViewCell.swift new file mode 100644 index 0000000..6ec3476 --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/LikedStudiosCollectionViewCell.swift @@ -0,0 +1,88 @@ +// +// LikedStudiosCollectionViewCell.swift +// Fillin-iOS +// +// Created by 임주민 on 2023/01/19. +// + +import UIKit + +import SnapKit +import Then + +final class LikedStudiosCollectionViewCell: UICollectionViewCell { + // MARK: - Property + static let identifier = "LikedStudiosCollectionViewCell" + + // MARK: - UI Property + private let markerImageView = UIImageView().then { + $0.image = Asset.icnPlaceSmall.image + } + + private let nameLabel = UILabel().then { + $0.textColor = .white + $0.font = .subhead3 + } + + private let addressLabel = UILabel().then { + $0.textColor = .grey1 + $0.font = .body1 + } + + private let scrapButton = UIButton().then { + $0.setImage(Asset.btnScrapActive.image, for: .normal) + } + + private let borderLineView = UIView().then { + $0.backgroundColor = .darkGrey1 + } + + // MARK: - Life Cycle + override init(frame: CGRect) { + super.init(frame: frame) + + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Custom Method + + private func setLayout() { + addSubviews([markerImageView, nameLabel, addressLabel, scrapButton, borderLineView]) + + markerImageView.snp.makeConstraints { + $0.top.leading.equalToSuperview().inset(14) + $0.width.height.equalTo(22) + } + + nameLabel.snp.makeConstraints { + $0.centerY.equalTo(markerImageView) + $0.leading.equalTo(markerImageView.snp.trailing).offset(7) + } + + addressLabel.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(7) + $0.leading.equalTo(nameLabel.snp.leading) + $0.trailing.equalTo(scrapButton.snp.leading).offset(-12) + } + + scrapButton.snp.makeConstraints { + $0.centerY.equalTo(markerImageView) + $0.trailing.equalToSuperview().inset(16) + $0.width.height.equalTo(32) + } + + borderLineView.snp.makeConstraints { + $0.leading.bottom.trailing.equalToSuperview() + $0.height.equalTo(1) + } + } + + func setData(studioName: String, studioAddress: String) { + nameLabel.text = studioName + addressLabel.text = studioAddress + } +} From 5a62e56675efb35c0041a3816db3b47d588f7c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 23:25:57 +0900 Subject: [PATCH 10/17] =?UTF-8?q?=E2=9E=95[ADD]=20#146=20-=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20Asset=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../btnUp.imageset/Contents.json | 23 ++++++++++++++++++ .../Assets.xcassets/btnUp.imageset/btnUp.png | Bin 0 -> 3609 bytes .../btnUp.imageset/btnUp@2x.png | Bin 0 -> 9630 bytes .../btnUp.imageset/btnUp@3x.png | Bin 0 -> 17600 bytes .../Constants/Assets+Generated.swift | 1 + 5 files changed, 24 insertions(+) create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/Contents.json create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp.png create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp@2x.png create mode 100644 Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp@3x.png diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/Contents.json b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/Contents.json new file mode 100644 index 0000000..03af859 --- /dev/null +++ b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "btnUp.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btnUp@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btnUp@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp.png b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp.png new file mode 100644 index 0000000000000000000000000000000000000000..d81682920d7fc4e2986b011f666ac415e4e70315 GIT binary patch literal 3609 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 Ut|=8qSpWb407*qoM6N<$f~tu-ssI20 literal 0 HcmV?d00001 diff --git a/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp@3x.png b/Fillin-iOS/Fillin-iOS/Resources/Assets/Assets.xcassets/btnUp.imageset/btnUp@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..748882dbe5f21ee56ae2d8399a2d289caaf0dd54 GIT binary patch literal 17600 zcmW(+1yCE^7N(Tq6nFPR0|bW_cQ0PjV!_>=;uLoc!HO0r8l=T37TjHnySu;qFEhJ4 z$xJr)-g9!#`D7#2)#Pz7DKL?ckZ=?gWHb@iq5lqaRK!`FLFF8A!EjOlxgsIa3;lPz zl1<|_Mtu0nRa0IHsd9vB5Ag=YQc_hC38^L?>k<402}wprQASeR>(x=Vb%MF2_v)(a zSL3gPfV2cWx>zP`0-j86^iGRt*{Js{bDXb`S4s*2BEEkhcwi;LU(`n{I{GFze^L3JE&k|{!JW}2ha{!tf1*Ws z;AL)8IvX}?W8CSVi6fRDk3I(veW-L_AyEu_knZfUbeHDAIcevkB91XcN8{d&GDZ!~NZ zUn$@CAns72MC@_#aQ-x!q=qwC;3xUI`$r--x4COI?d!$`0*VrEFw)B@?u*lCqrmM! z{mXsTOOxS&Ywm+Scku1CR?c~fVb$L4-w?FsuMUkp;xapX{Mn;z2JJ7maB;&+VLR8C zCel9mt7FT?7tl+*9h)C9VuIvmt?fgaMqy>@pcE3UFYtymEj!~4^-|?S@jdx~OZfwy zrCDz3_#;+Z(Qmnl|N3hJqGs;(mq(37zc_%@V&CIv%}p4>_~^W#y31K7b#$|VmUOe3|F4tv%O?2lBIupF&ID2v>HnQU? zgN(m;{EIYiL}(+1W`ZnFuH;*Z+nM;?=YkhXew@@K`?loUN>rnQ0G+Q&?u(kC{WVyq z(iG^abaaah(#_HYD05nEluD?^4+b=S0)IX-2DS@is65Vv;EJJxe2y$*;2XyuSMSt> zcd}duIych&7erv6%=7moLbMV=H za?WL8WVW~z)R{}69Cqn+Im#^+uYQmqb}jzk_oI`ZgC1`rSpBZ7P!VN7E%BZjUZbj- zrOF0gkDSHH4NYR77_Mz%&hL9*Qe+^;YL=b|_0wh%kim;Ee(eEouwV3;5A@4vty>mz zP4~Ng%Q$ccaM_?3G1{KFSv+_EEebyzK@S6>{gOZU#w0w@`X1IS()i!5`DG1RJ`b-x z#^S0g^tJ=OmUjPm%X23{5bK^MvXF)%bzd##Zp!gV|N7p1k2gUi6_S}Ml$i=#1_W2D zW`)pZvA)~9Lq~8dWWmim~!Up&ZJ#J4XV+^yA9$ZFBln}ddaL1}s@?y0>s#+EfcR~Q_*`CP9?5ya zKZX*UVu5=B_?>vy-;OSm&KrCIecF}Z``}vp&qmH~Po>f}6`N)uGZud>=wcL-LLBe& zVB9C6=#F@whSUg{jRu*b7HPS>`;|Rfj@_$#Lkv!)1-$%WS^B}{sA~DF;&=T3hA|wx z-ALA)xmM4Ul?S2zILWty=dm(9g@m}NVp(W@LhqbFgunN?CI$X_bcJET{yc@&VKi68 z$Giyu;uH>R^X$pN!_w04xm_?LG?g~D26ikTP*S5!`;Qjqoqg#}9=$0=)KXxPc$;@~ zZGI0Pnc6*^F6%!!C8_46%*P|g3L4fDdCyhV6^9!#`pl`B_NCpAQtj!ilUr?{G%-D% zvjqU&0_@;2?b7(FvCJ)o5woCo=N@aA795MAN70;3yVJ!pEsFxVM%zY7RDwf6r`%ej z&o}O~1~-Ti{Jx>+ND@(?w4=+8x6L$-!dl~jD<)8*h(us({Z;o5hf4Ex$T1IxDYp&P z5bkJ`}Sm1&-bJ^P|r#Vco(rk0n6MTchG zbt)mJAFDN{@{SF-4I@O(r`4jj|3V6{F1x(qM1S}+7Alw6NN`g%KBU^e5fTHRcI!u8mQSw!L z@zbjGFw?MzTFX(Ir3pU;>OL)u;05A1WTU|XRMhT0ozYsUf3B6uA9gZ;T~l+=U{2zg zAEsVbB0UDZEo-xf+7T0WDfNH-8As$Dn)Zrs;1VMZ!!k7W>eDPP^71o*`s4hrf$k0V z18e55UEhPZN0ieBEb52Bp0y|%>>w`_dXP+-L9<8e!sQ{?LTUR~3eXI};;`J^QF{C1 z)^CxU#!+5*et8Q=kAX zzHl*qR5sUJiQHe56xz3q6`koq?~9WT)MDN-2|YV#wa=ij*jIAHJJ1~3pROMm6l;|z zX9i3eZJ`&8M_~&;XuiJl|7aBaDpDM2Nj_P;#u~i48nU7ny~k zK$RuX$SMgc^S^S-+@#KqmKkYO@1L0Lrc^03Ru*(4m)9@i9i1J);%Yg4jqhe>2C|&{ zmkGDd)O_>+Nca;op6H%4CfdkOX* zOrE^Aml~GSQ~+~o*Cne$l(7A{8-FNk%0?!ghqj)lR<(497z^?fA8vNh=(XFG%~+~% zZ0GUA&@#|#jN3IVuZQ~%2b2hu81vJtLc;=midTtC9x1H=ZoHV&Y9wmxU`kLQB{TW4_E&z{f`rdY>5?aW4bs9^%hpryZ}`&78@&7=aU~ zUq2}vcasMibU8Za2vEI#+$LM=Bn_KWbzp| zN{x$GQ~ojNwn7TAdeOGN9teBwF|3t)KlS3@&zvrjOUK%v>NU|4^8+AOZhPTA#eb!O zq_MnrZ97-zufM19bU8(L5O&2hr0r^l1gcgA-u7{0QqSPXMI&-yDJ>R2Np}5Fyo<(% zHekdx=RzczE}=KppYau&YFn(2#f}@vuRS^(2TPvU`Qr7yZN~4(ad7 zDd+_6G`jHGi^KR~b|z#RVrG&%zl|q<fH5l2R1O3Q_X3Kqi_jwQ$G5t?8x|o^& ztKUDDO8O{5>H^_B(sXcdF8Di>8Fyw6M)bjLmg|Ujo@}fmJ5DCeb>L%U)wiwpzrzb9 zyJL!SKu!y`_Cu96PPb|}#t|a=x7lhFucMg* zmeY1lBm7P%MW#qH{n1R6*QHCJR2D`C@|Y(K{jfpOy82~{VHjI0xtGBP$G^7OsU1T z&9@=Cu6Avb%pHC^4G7cSI*#DdXpY(+<8U|CE4Q7j2tIZ{-6|w+ zy;u<~hi$r1=pwJJPd)fR*WF_+mrD1v%KF@xtYroBuX}dA~V86c$HGK_!=T zvy9l4Y3qk06)DqsKxc#3AG%ycR)X4pcX9!absm__S-5(5bp!uBrl_(7u42yOgRSgSksy z8?ke|m1%i7dC;18Lb`>SbrdpQW;DO4EtG0*0eZ8b*Ajn+>;?ljbVlQ%frGN=7uel+ zVgJkq@on`u+8&lqo|le(ulg5=TG7Y)j@lhkVS3j3jsQI1wwEq6@+=)GJJ?q$7*JlC zUAPK#L$lwa@lZQF`##*;DX9&Nz{149`a|6R%H5H`tpRmG1h#Kj2aEYDXi^9RFV8E6 z5)c~W#@j`Z;X*yYUd#|<5@+F`O1*Qe*I?f|$0d%ht+kaNa}0XG`FE~wYkm!-#@l+_ zQ2WJ(*u4|GZYX3YW~PpComYWEf4DXnYCBDJ3YmPE_Np3!Tw(1IB$K*V`5oCB=}>?u z;s{6_?_?`f2trhAaUb5G1$u*QF;xc~Sp0fJ zpxdIE*!CF^f})f3eW+hM)$6$au#7G8YFtOPQ66Nj}bjb&ER1fo|dP2Cxc~Z-hie-S43SB9bsX!F|Ge}}p35G54m`Y6s z^p$!Xf&5dL9ZK&^YgbZA5`c|WYToG!jHEfeq zjNjdA&Hnmbw5wechqSb0C8=zzchaKHS_yixuVkqnnsYc7Xa^G1a9VCDdcf#$G0Zzt zZ2{~*D;f=Wz7UW9>sTm^V$FbMoDV>%HFrW$M+Wu|4?RGZy^9ty3a-+qIl%0oPLH#V zUVYL;vU>|R1FQ9mk%_VDUc^0S{@ZH>p$5FVcBsf1svG358e)hu|JtIKMht&@IxzA) zpYzJ@8(w0KpB_)xwps_y^Umx*lohGP5a^T?_d1$25ov6V^{u5J9r~n zj?D%Crp}f<`i*#9uI}$k+BG^zu$JTcs)~nLKKU^GbskqF{U$^k-IV6b=$g!+mI85|v^54k()wMF zkF?lYiFhq!;cds%l4IUehtM&8x7rytr#&UCQI77YIt%y z)ayzFYi|Ek9q<}Rbr}u@7?>gbNdc>(O1R}Z3)ZglkiB>fY36S0WU|Po0K2}`EJ>*L zr!FnMH$01CG0+X72ZheUYgnvx!xFbFht%$>6HSajDcEA}s2I?x5uk4Ali=bTc}aM~ zJW%^C>D52tjJXx=xQ}~gzf{vfv7vk6We|&K6Ut@0J(K*J;bj*TfILZ_B2;G$`=Yb0 zB6Qg<2WBIk={pZ+njcajj^Lxu6lN)`SdJE|G;Yp^{KB!Q><#Pp%Uz0%@r_ebx|i-@ zswhgOu8Ltyl(kCQ?yC;JSOfs?)?n|z-~Og?pC`DLf}j~+Cyk=_hopeXXf506f8!+g znJj1Ui-z#6Q?* zy%+8H4u{tnVD?H?^eed>s?u_Eis^Q5du+ej#b_Udm3vZ`(S*l*yr+DjB56AtG`&+< zl4QQfEMi(2#|9h4fz$*9ao-!Ig>^ZVo8d!!8bs`dMBxgxM{D7@xbeU1xdT zmLkCO2HOTCotH2je2?95b{a-47TK+`DwcHC4ghP@k=z^5#&Q&IYwSp?4Dp)=pvI*G zq!@=`9k(ymj6(tDUh5{sz7`;=TL-v8Cte>Dr?l3EdcR0=h8wy5aH5v(0J};`s#?Ne zMX$kW92;W>A6a)Ex$4W$y7}0j)w*W=RszFoz{s;L1TpeV8iQ^+VQvM*kIb-vO2*B5 z=?$oKVf#MF+?f{+mNcsvgD`57aCl|YHmO}d^Q_y?RvPT2%cZeVMFMhbf&u_l{F&QM z5XDmht-*$Lg)7#4T8C`{PK(cjUaA*XW#F)uW~7fS#Ay|`8Sg2c^ksVekBt>E#f3j` zT=T?ECu~W-SHLi|EfoHs?=~)5#a+7g#(Z4fLahvjMADY;mpK zL-h1~kV~F=(Xc^i2KryT%A9+#jBY#A>A(cmfyx^i77F30@<0IO9R zqe?3hu?^XSQl0jNWps|iU1Wk95hzp+I{jC>N_i;GS<@K)&qQ}Q0MHZjVv@sC{6fhV zLY@SM0~=BkN=JCi$#KtBIsrDO%Ge=6M7s%|uYp-Z{&)Sb@6P%C415z*iok|3ChqIcKJ*mun`mS5>?9Gg!GDL zSbs2F-)rrAg1K^o`WHtS`mk>U!wB$bhrsvGDtJ){>3(TEg8v9oGE|qKkV?gF)KGKO zO-Dnh@q*~aI>DhDb-YjmuRU%W6cJ1XvKZ!C(}qGfVUQU_muKJv%ykwU2Z09Sz< zIr2CgVSTxbdKqgCqS|T$%aTa3()oS-*v3%}&<+&@5TjYJc8tF0h?R zpgE%dwjr^1mWN-8<2`~ve!IdWj*%A_8%G_I0%DsENE^?U&3N4vkx8c)`DBuBuZ(YD z*!SN$zO6OoY#{byt~OQj8eBS!*HRxGh@<`(Rs3Wc*~p{pHIPMzIrB4)M>&`Gper>y zD}GJwZFZH&iTCItPiTf93|&<;Gwi$Y(rIoD(K>fI{Sbn%i-1qvSgX9QV^h5e4=Zwc zc@!ROO!ceS6}!gb`~!oKs8+iuqX2eN0aD3)T0&igaB}7df)!XWbyo||Hk;}1Xs?)d zIUbfTgp)8U7K@<-ClBiRUE2F>QwmE?&2>5BJ*)wejuyo1lPoYSv)yMVX}vcSUo$I` zX~PtHv&s@Bp<~p^L|lv62|-mG=KXAAxL5-gN@Q26y&vU1VApfOj0Q*&I4QsX_xsUv z4fdJ8%q`$}Ljbnrc1+}T?nBB(?WRMC&UbD}_n%XUTg?X4-f~H%6L3HcY7~q^lct2TE~0U^!q@>urzx@(0UCxG6K(ld&T()R=QSV(qXx<#Ft}UO)Wnh@ z#?>QLH6m7x1pGd^x0fZ&&z(_TVj>yH{TL)-?t}YAL=Fwo;L}gUCahf*Nwy|5q+<(PI5u(#6f$ZHcq&PgR-rrdi^Eq!3KwwduEIVhD6b9RT$1?d0 zn1!8ed?6v*u+m~@c@1@9`(+W{12*g0RqZxL{b}dbX-ABh(%FeeZXLaj?|H5MdQ_-=(s-rFqTCQz zKagqIf;IZTGXoY7L#uNaZIA`b0Je$(Z#sbkaYF9$lD4*hDs7ib&VL zB$*3Pp;&9ogMu}n>Uq>5o0@)FJf*YQXD~N$FF#!_Hd{dxBmqbh9%GT#sCdT*UVpL9tD?ee|IO?c)O8#)AGJ#c!<*L1nVKpAb7mkLHhU zm95ubau>KBQste02plJW1yxv1?ImqnF0&V#J6H*Us<~sZh8Uj`w{cq-Rpx+Oh}wA( zGQgV5;rjA)Gb!2&7pyd=GFoPM@$OvAcP|wI z1V@a&jBWf$tudlgJ+6VLY$~0N(&fg)n7eZD&e&S`Uw#pD$z)!#D*K)&mOhr5^QWDU zZ-_nyhzkuZ6~HRxW@q}U#vH9_zN%Ygeu0O((^9T!QJh|m?ZcgD8xr@K1mpT>VhkAG zu{+yv2+6}ql8h1$O}s|IBhY}ZhARnN<=Ayi#if^*V!az*%W`;1tXN`F>00WXs%$N< zF$e}Ikh@=?wax<_W~*ymchtnuaDh^bF4=;ncwasg1c-kmxX2lLs3Da~Y8mGWg> zL@@B=QbNF8ZkRCnQ&^eake~2DYo27|-%$#*Sr~yuTC-lFzl06;oj{f)sf{5ltg%}f zSF|pD3PSJnesI?kTYj23$z1B63m=8|KORP(^B^_{ZAv+sH!=R(9P;rYd^Y%le3lWv z5h%;Dom!e>@qF@%e~9=k1;$%C@W476k-hfmg45JocYYq>K$+E;^^ z$(*7NTTX1ve3Ja80C`T3{k95-$O$)%J5&6$FSZV=A7$FO@!N_q%)_Fe@_#2FzU@{`qglg@# zz^p!_N|*lMsq$9q-?-^6)VpL)J{;}ww^(383kEF?l^hN49u_ibN00)9CRL@Pd(5WJI#RHU4`!n(FoAmy=4yK;pt`vOFpPHM!MDlpK)oJ%;3* z)%C`Io@;Ofml3u(!&6Ay9je6H=2crmNU~~($Sfo|)X#7e*^_=?zMgWN@^`JnKUNR2G-N?lrNcs|voeFkpQm&&V!LyYseyKguEq zg-D?44oOsRHP~*^6rc&$Q-{~ZDhsd7Y-rB#0|n_wC6)Vv>lBB%(sF5gtIT$+rI`0z zO3XCMmVPw^thV{JHfACq5)Laq$@-s>!e|o?9cC?R>|--U;wf%>(`Z|OvM+@M>dVyM zaTiw1#LzvsaefkTKHzpOJacW;NfT^(nx^pQP;2Ko>uvJdrp6a>Q*zjkw&8bahnxH( zXt<2nIXtDN5iGJ|ubOBK-_#d3B48fwoUCVhSXeUBq*L4Z7~-F%prpccYs-t(n4)~{ z)-PMmJw(gS8}1Gq4}I)o9`Ff~XkWcWIzZsd>QSpYz?Ve?p}Y-94dT=If-MlK zKY;xWmg3Bo`PnYm5<4WzWAcuh%DvM}Xi$4KHcYSAwQN1>%SR9H47eoyJ|UF{4UN-IMk* z)9_Gc9;+1(5a^8=X#U(}S3V?7WkLg4L_t7u?a30A=6a;|mRa@8Zasba*Oaw%EXP~L zY5e6_fajYr``^pgjoNWpIu%_arjL081P^btf@_rD)QCRXE~i^-?h_QmrT_X3#shV+ zSSXM;t|)}d74GG`;q%4!1R&_51ElCzhD9bdlH(8&Grz)%PZ6ht2_jDa0$KHudyFDD zYz&nrz`NfR*Ux}O;-CgLAm?R{YFd2vIr~0jla={D92>$Z{2JZ^NfLs4$p3jI>B8)IQBrG8UE0qOg zyz4>mksdh5n{>)L^D-nu*u|bffS8*trf8=DC9Z8X2>uj(#|DScG+a?)Q}nEx@N?$D z@n7Iqi6&jMwdSYJFc$SMdl%`0 zx|NC$rS3ZOU}vU}sJI~$Pl~B42r)PSp&l*GFudTfVk)FNe%qkD{8afm*Q937BS|8y z+Q=*Lvvn82)kB@m1oM00Le(A-#la*CZCwlFVmQru354TnLLcp@218@t=+Il;;>?9T?~z3ms1Ws2xfB z-Y%U`{_JGM@0F$pb1vU`hvvVZQ^LadktceBH*r%prQ!mMxVnvqu7$3qw0<%?CIP)X z`n5IE{nHR8fj&`lo@>>KaxdCt#DZa1Cc&{wyDu#YAd6Y%W;XM|cX0Xb^RHgd7rE^R zORl4>MSOha_@^-$AFc!K)zteD5Z94xqNk5X02Z@FUmJckH&s*9W4QFu!qmlNe~!$P zCl0yRo&`U`^WhCf@>I1yGsYzKnppD``(%HRukd!Pn9zLRh^AHrUY zZ5G=RTs<74@ITF9^(#rTpS2TroE$0PS6bKxqA=M{^hAazS)d3L9h(K<+K`X1C%;Sn zDYC_u%!eC;#xZ%h4!7%4kyXS0TG$=>Wybb-5Q16IcMFfT)X=uecwLmYcI$*Us+WOZ z7)qo7QSV{-5O)7PCC?-GnXvJidE^(m&SAtEDOg9YT?B1_L(9@t-`j<&%kXh&iOL#1 zUgW&5jpWHu$PlkgeaYPT^wU;cP5hB2iE?5#(MQkY%ULItHR=trYs`HzQ=!>o+#Q(y zTX_*h50x^3mc2h+T_d2<^l(?%D3N8jV%$YW6Y;`;4t<@%UnG#AM* ziR<@ov_L+3+tDnX?fuL>-iO4F)>w;F#+?~z-f8qmQGgFW<*&5`Xn$LYy2jFr4J9`$ zjL(NH>`@738x0j=V_iKzx+;)2pLrs3!88!(d{w@zT1KZx8P6^qG3CVG6B`Kmh2PK% zk7SdTNPgVbkXh`a7~bNRg4rv1CY2J?0j}gP+xc<3;_EomF#%E-8FM@;O_3a~8?l1N z0@H_#h-G|dTsFh%*#6`pQjuJ3kOi3IDpgRaA@xbt`OIUAySOzjPpdPThLO>q5RKLv zy(Ecb^bAJ(e#lr3lM511Kq?JOmVlEXfzw?M(fDmhtq*ng@x#TgEc*e z2n?|AC3Fj&?-v|n0}qRO;rJ1f^~rzG)ll96->qZ%)Hgdp?o z=6dRO3qfvU$Dn@>SVM3{>X8sEO_riV-vk&SscZ5+vRMYRo$_8_dudG2J%;ZYBa|GK zT_+0gU|x?{V`i|)zfZx5V&cYsAgx6Jwn>)fKj66Z)9}yB=f}+_&w&-0HZwp%ZB6L% zxkh2sKs-H$VNFEqA0iC*AyTD;K@-fEP_iHEoJ^>M=Yc>oX55b#gNz=0`(#2Esn}ry z96wjg_tBU?q83Y&X};XCs^}lr2CQ2uV_6AM#f2C>EX?{}HLpG$`xhz|wrf}EDVqHq zgU1dLk$Cm0*YBb;F3N7iNAs{u$|&+nl=deL;3KC>Q}Kh%=(kwNU)@O2J!@{bm`C0d z2G;K-ufhUuLyGd~|MtRlaLGzsHDtt--ox|qR66}L-hCI(zyETt-jkprhDz)iq|S!Z zdz7|yA4iQLFALE&(wfZEO2)o%)Y9)AhT?3XtkHI`(tJXC*>PyQ+m4@0chRx7dM9?W zDUWcIa2aJQ#Thgeej(*BC4UlusB{ zw2IGhZcjD960b_j1Wxkf#?9I1(6=W8kzRyc3tXQq#UJKx5I!a1(fWg@8PSgvif!IV#j;R#7D1SD7Vz>Zh-wQ?=x!m~p&;fmt&wAm--GOz7!y5rGgVpEj-?T$C-1ESY4}Pd0B2&rk z#Vm-%1*?9wkKE>WGuasImwS6TCUSC1Y7Ucr)ZIgl%K*|TiQ}4b^omC}xfFf~Rh)W$ z@F)a-I#jHN7Y=7Cb)^L=rW&=Lv^`w2m%;$WEmM3?CF8k;>`Iz9aI$;uXb53gmTVn` zHn&2ET-R02*G=+49JX1hPO4;_WPEOwRbADfLvkggLpBLE-tc}Tx~ukNQEBtyY+e{w zu$U0mb$nY-8w3~OYruL~UiCbv_m{_;2jUyieVP z_HKDpCiJ@|^AaswkztUBTSD`3!#&2MqB3I_ax@T2sk!D=T8{^EhF>(2X>p`I*{jifXB663=Ev&(73+fXi?K&oyrRkP~GF(H9^qlBR`OH^^)H zm*Lg69CY}50w6a*8y}=J2T0-^AjX3I2s0mr{Ptyj`d&=JZQdhe0I(n0lJh$z?h2ul z9C-HXN1oAUeyspa;4wgnE*UGY+?Ec1>&{|b_A6swrILOE61VTL^M4~ly=!Itk$n-E zaf41^a2a(T@Fy??u(4~1VQr(yY@>%E=u+of^g3pdgGIIXJStVYQso}Ykh>Sk6a)QI zD6w@$4m8KnhB;UtOAN=)hx_O{j)*WYb~A@Y3XdC5NfSY(GgCnSu+}K9Wt^`L5o*w5 zS>gf5Cq(_Lf(3$6h%})Bl)F>bG#+twe0tI=M#~pKd z=|rxLQ?PxgxR*eP#U#^>P5`?!9)exofaU(3nE;9H~TL#)%l$E=dLgr(K4ZYKGE}yK^s`J*4S2!BF97@?ia~$3K zy>)Ink?3VqWn|1ue;_(8uCxu!hTm zNFa6xLT>#*7&&5f_fMo1({P_Zwun``*+a@lLCcPBYd;iI;#UwpjnDE$Ozb6{kKqrpk69GdBaOtS@_lz;%4= zExg*&Yq>#QfxKbMK|muGM_L>y9e`g@N<1x-!$343Dize+M!wL!F%8%pn{x8PE!F0q@x@N*T@G0gfs zqLGtXm6`(i(}7Z(8Sdqt6-!i?_MSy5vMa1w)9bw*v#o= z9CmM)WQ79u?-}?3jq$cS=|mHHTJdv$@{eGKKYNREY52>$!|5yI1sSF#mfcn^n5rY_ zf$#KtnW8^cDPq2@z}C?;&pEza=)OUwb-V`KRt46GWzH85nj}-}L&T zFccK`=3$YFeqM zCibZ+k*(1CVe`FzOz5wTp1SVyoDt$OalmxsSK;ErjdvIsGWOAn^*pCquiJFomy8gt zM?pY@gSEx>KC((s@jZ%0J(Vi96LasR1%WkR4g{g8id3oMp8~}EXwoR%GsM8bdL^q)G&~ZI7;7jEBrkGfaQ>Go+pi0P( z#x%UxeJ3=a2x<}^Mw}^ zg&H2?o`AF~^|rH)b6Q6~l|!7ym^xVhQ_(&pgc*_OR1x4m*iAin2pnp(x)|zl-ban3 z=;V(PL}oN-)fb{M6I%w6d3Di6V}DyVz7DIh}mEv4q-;imcT$ z#b(4%Ahf!40x2q7lRY;1Z;o-cBGqaGYbM;jXkMoJWRK*5Q_OO8nbjVN7M)G=T;>;dk*CJbNA=be15VgwDOM37ON+5P zs_CIpjJx|(`l8S@Y!kL_Xkf_asf-aD7^{+&tVpzG_RFmP%FeF#{E05wQNB8ADuTcy z^LcnBZN@H(lcmu8JOe6A{PU-FsJ--w;Y+!bc=OjLKrea%-~HoC%#x$&?!u4T3j{5K zey(qE;vI{_-sdVeuP0>n0(ZB_TyjD5zJ`|9!AqUYGf=?^H0Kn|i!b)xOt4Mzc81D) zZ{{bm{m&pb{K2%+3l*g|U0A)&Qg0N}3WHS>-^8vj*jA+$)1N?~dTy+le5?kYW(jlZBqik5Bp7wFexi=v8d?}uTF+&`=vFtk$w~pIMj;OB#hHp38SB0dcDGv3J;L?V+!gqeD zfD#o3bT~tO4`pzA&s-E!6rl|7SZWXSXIU^ksMG#1+UC^NLGMQ{8nInOBV$Zoz5^`- zj)1Bg|E1qO%2>wo7#lAVE(MxZb+ty!_j7b$Ru+SMd5AIjI2!BaL2B z+%__+ih!U9mAYVAL#K#Gqgsan7u(SsN20jIuL{(`K(+^;qSGgb8$*tH9Lpe16FM;L zQcD+p`Fsmnl(HTACTG!ew{>{1&>!aE%D*_vX9zSLJ4L~W!{M)hv#Zb*!KC&=Wl@Fs z5Qa+iC*OeKEQs6qgJQO(jc|oB)x(+fL4Up;3G>Y22%>X}KDx5MevUqRnX`DkrT<{3 z={8b*Mec#EIn0#icNntJ@bGPHX%}~%!bQX?j_{OK6Y{>ckOaYzhP4n$}8Ts?FD zj-$+9wIR~-4Q^yUlcMTTEG6yNH~Ie-K6i`t=-NE!&c8>0gs+uvdZLOJ{&xP3*GYndFi*P>DJNNlqKlRB=FZ7+>9A^y##-UQFQEU~Twf!+< zb+`Y66LfjkL|UjmhjPdNvYKyL_{>F5EL41R^P#wkX=L_>=W0qemc2+#V)Fr9O*+r) z{H;u+1)xZpYo-%>nzXNjJYY03Q&2t%`BOhe!-U$C(F;~>OL%@sAqbU|>`8%8^KFy2*iWnIC@ zksUQEJ)mQnn^ih@ZPV%WH*WHBjz2ys>lgS~r_z1agD>jTmGN&)o1mt4Z{q3h?0Dl+ zyge;!RGg@_&Bp(;_6L`$a4BfahP!z9%jol`mv+^%+nsJ~qm{?Z6NNJ(4(K<27H*eQ zBrP8-vkg5D@?Xh#?LW0^fO^|G0Ap!9mOP4}dzk4+r{ccHZa%G4LU(_BxF_nwDat0C zzuvCA*9H6|PPLxw*B$EXuACCFF5=gb=b-xMAd%v-+Yaq8zE>>{H9-xyhUi3E{I}lB zsFt98Xubs=wi~J^b;|(KTg}+XyEgk1VQqra^(MQAj`)Yu3z^M7;xP;a+E04NprIF{ z?)4Y3!jnLh&&lsh7i!Z|0HtWS7&Yg`i5H~Iz3v3M5hm@C1njISrRfpttiI;Q*bk}I zVD#kW7^QUelO>^J&Ye7Q@f;U53OAQ2J`tNT;!o7%cR_x5JnDKTU%oG(LF^T&2QdH8 zWK00O|E0-JO#N);DIxFn$*+y0xRG|&*HqlOb)N1#(8I9CpA{nl&4&jQg)fJT;kwj@ zc3+xa;|YcGjlalU3nq~y&2^dDt^BFc@7{I~r3&vX$(8vM{c|0Seri!qW^e1&^ zz94}{Xsjo^h$2GkhQ`QWG_7fJ>KmVk2^HgR|(Pt9spZpGXH~8v0#r2HlMhAZU()4i~3|wpMRo4A&6&Ri9-X1NIi`F1AQ-pk5SrCxi$)mKM>S3W$u2l)?KaO2H!a*C!9&o<{@%^zy*B%kii1{|Ny7hc&%1Z8>{lnOgN4@}FwVBfo) zi+NCRN>RVglZaiCSNx*GeJ&GNI$yj0*Oae9@J=*;8L13-?V}1|mF^x*nG5YvJj)Y> zYKAAQhMsu{+YPk&^QWHbCidt8cmkCx{T^MNOYG?W$=WO^R^&wS_x10}=RH+GVAI#f^u zgbw%_IevEkJ7UOLyGb;my!xiy!uRJJiy+RFP!&Nwp!f;s_->D_RWSxx*b6_n4@X7H z#!OUY{aKmp%)hd!P6CgHVqUg9W_{`Qqo0x1U-&BxxA;s{SL$%#FNL)4M(KW}PrLmu z!UH}0L)%k>R82UP5v^t%NFG~{qoiOQbCNh&h(7=%kou@aAkR~Bk_7VeAPehA)2Xo? zwi)QG0o(cCLIvU&#FOp8y%{keMW-@f20xz*n6Vl%$8k^dLH*P{$9?#h6htX8scL`b znP++|OJ%|!)v8pIfEhI_{fu4>n+BUo!VIva2Mp9TIS6Ess#vWol@hqYuOvYbsvDUE zo<+bhl@>%PfgdxSKYyoABB>-<5-r`@QqMLS-H~aHbSPOm2uWJ_r9=#=SKLq32>F1; zaF2VdQVZe(%@3J-7W3f9DJ)>1diD9c?3bG8)#&m@^nk4f8`9`sCHkxqm0geDoUdU?Wd%)-2IwUd{-PjZ;G6SV2F6rl?0a6Kvb} zsYv8p)+{==MDvfl&wFu7;O^xZpJUs71ZMTW`2BES5nQZ6Qtsa*36c}nu*a;V_VND{ zM`1h4gr}S$P+v(iwGOljQ+3kN2+CV988fTlVnB=rSGS^;y1!OhbO zPRLS82tv7cP9)G=C_v~=$m17hHLtV74T8Lp!2#-8J?& zZw6og#gcN;8XDFV8hD8`s3eAfH8o8RwQ6=aq(rjg0(+U+!r?C6y8ZN|s{j+)|p< hXlQ6?XlU33`2W``0it2@EB62Z002ovPDHLkV1mjOZBPIJ literal 0 HcmV?d00001 diff --git a/Fillin-iOS/Fillin-iOS/Resources/Constants/Assets+Generated.swift b/Fillin-iOS/Fillin-iOS/Resources/Constants/Assets+Generated.swift index e54b0e3..b7b435e 100644 --- a/Fillin-iOS/Fillin-iOS/Resources/Constants/Assets+Generated.swift +++ b/Fillin-iOS/Fillin-iOS/Resources/Constants/Assets+Generated.swift @@ -36,6 +36,7 @@ internal enum Asset { internal static let btnOpen = ImageAsset(name: "btnOpen") internal static let btnScrap = ImageAsset(name: "btnScrap") internal static let btnScrapActive = ImageAsset(name: "btnScrapActive") + internal static let btnUp = ImageAsset(name: "btnUp") internal static let btnlogin = ImageAsset(name: "btnlogin") internal static let goRightIcon = ImageAsset(name: "goRightIcon") internal static let icnAddPhotoBig = ImageAsset(name: "icnAddPhotoBig") From 60eb256706162e45263aa7634567cc44d688169b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Thu, 19 Jan 2023 23:26:29 +0900 Subject: [PATCH 11/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=20=EB=B2=84=ED=8A=BC=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index 9215f93..7f44cab 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -27,6 +27,10 @@ final class LikedStudiosViewController: UIViewController { return collectionView }() + private let upButton = UIButton().then { + $0.setImage(Asset.btnUp.image, for: .normal) + } + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() @@ -56,7 +60,8 @@ extension LikedStudiosViewController { private func setUpNavigationBar() { self.navigationController?.navigationBar.isHidden = true - navigationBar.popViewController = { self.navigationController?.popViewController(animated: true) } + navigationBar.popViewController = { self.navigationController?.popViewController(animated: true) + } } private func registerCell() { @@ -74,6 +79,7 @@ extension LikedStudiosViewController { private func setLayout() { layoutNavigaionBar() layoutStudiosCollectionView() + layoutFloatingUpButton() } private func layoutNavigaionBar() { @@ -92,6 +98,14 @@ extension LikedStudiosViewController { $0.leading.bottom.trailing.equalToSuperview() } } + + private func layoutFloatingUpButton() { + view.addSubview(upButton) + upButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(36) + $0.trailing.equalToSuperview().inset(18) + } + } } // MARK: - UICollectionViewDelegate From 72cde3bc3b65bfe2bfac4714491ac97a84bbe420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 00:28:18 +0900 Subject: [PATCH 12/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=9E=A9=ED=95=9C=20=EC=8A=A4=ED=8A=9C=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EC=88=98=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=EB=B7=B0=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index 7f44cab..e2c179c 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -16,6 +16,7 @@ final class LikedStudiosViewController: UIViewController { // MARK: - UI Properties private let navigationBar = FilinNavigationBar() + private let headerView = UIView() private lazy var studiosCollectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() @@ -28,6 +29,26 @@ final class LikedStudiosViewController: UIViewController { }() private let upButton = UIButton().then { + private let myStudioLabel = UILabel().then { + $0.text = "My Studio" + $0.font = UIFont(name: "FuturaStd-Book", size: 16) + $0.textColor = .fillinWhite + } + + private let backCircleView = UIView().then { + $0.backgroundColor = .fillinRed + $0.layer.cornerRadius = 12 + } + + private var studioCountLabel = UILabel().then { + $0.font = UIFont(name: "FuturaStd-Book", size: 12) + $0.textColor = .fillinWhite + } + + private let borderLineView = UIView().then { + $0.backgroundColor = .darkGrey1 + } + $0.setImage(Asset.btnUp.image, for: .normal) } @@ -45,8 +66,10 @@ final class LikedStudiosViewController: UIViewController { // MARK: - Custom Method private func setDummyData() { for _ in 0..<20 { + for _ in 0..<22 { likedStudiosList.append(contentsOf: [LikedStudio(id: 0, name: "필린 사진관", address: "서울특별시 영등포구 여의도동21-3 가가가가가가가가가가가가가가가가")]) } + studioCountLabel.text = "\(likedStudiosList.count)" } } @@ -78,12 +101,13 @@ extension LikedStudiosViewController { extension LikedStudiosViewController { private func setLayout() { layoutNavigaionBar() + layoutHeaderView() layoutStudiosCollectionView() layoutFloatingUpButton() } private func layoutNavigaionBar() { - view.add(navigationBar) + view.addSubview(navigationBar) navigationBar.snp.makeConstraints { $0.top.equalTo(view.safeAreaLayoutGuide) $0.leading.trailing.equalToSuperview() @@ -91,10 +115,36 @@ extension LikedStudiosViewController { } } + private func layoutHeaderView() { + view.addSubview(headerView) + headerView.addSubviews([myStudioLabel, backCircleView, studioCountLabel, borderLineView]) + headerView.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(50) + } + myStudioLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(19) + } + backCircleView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(18) + $0.width.height.equalTo(24) + } + studioCountLabel.snp.makeConstraints { + $0.center.equalTo(backCircleView) + } + borderLineView.snp.makeConstraints { + $0.leading.bottom.trailing.equalToSuperview() + $0.height.equalTo(1) + } + } + private func layoutStudiosCollectionView() { - view.add(studiosCollectionView) + view.addSubview(studiosCollectionView) studiosCollectionView.snp.makeConstraints { - $0.top.equalTo(navigationBar.snp.bottom) + $0.top.equalTo(headerView.snp.bottom) $0.leading.bottom.trailing.equalToSuperview() } } @@ -111,10 +161,7 @@ extension LikedStudiosViewController { // MARK: - UICollectionViewDelegate extension LikedStudiosViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - print(indexPath.row) - // let studioMapViewController = StudioMapViewController(contentViewController: <#UIViewController#>) - // detailMyDiaryViewController.diaryId = diaryList[indexPath.row].diaryId - // self.navigationController?.pushViewController(studioMapViewController, animated: true) + // TODO: - 뷰 전환 } } From 6795c9dedb6d9fef4df40ba93729d15b7fe851ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 00:28:43 +0900 Subject: [PATCH 13/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=EB=B2=84=ED=8A=BC=20addTarget=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index e2c179c..4ff5753 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -28,7 +28,6 @@ final class LikedStudiosViewController: UIViewController { return collectionView }() - private let upButton = UIButton().then { private let myStudioLabel = UILabel().then { $0.text = "My Studio" $0.font = UIFont(name: "FuturaStd-Book", size: 16) @@ -49,7 +48,9 @@ final class LikedStudiosViewController: UIViewController { $0.backgroundColor = .darkGrey1 } + private lazy var upButton = UIButton().then { $0.setImage(Asset.btnUp.image, for: .normal) + $0.addTarget(self, action: #selector(upButtonDidTap), for: .touchUpInside) } // MARK: - Life Cycle @@ -62,10 +63,12 @@ final class LikedStudiosViewController: UIViewController { } // MARK: - @objc + @objc func upButtonDidTap(_ sender: UIButton) { + // TODO: - 버튼 액션 처리 + } // MARK: - Custom Method private func setDummyData() { - for _ in 0..<20 { for _ in 0..<22 { likedStudiosList.append(contentsOf: [LikedStudio(id: 0, name: "필린 사진관", address: "서울특별시 영등포구 여의도동21-3 가가가가가가가가가가가가가가가가")]) } From b205038605d59d16feed25bbd8115e059de10527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 01:11:06 +0900 Subject: [PATCH 14/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#148=20-=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=20=EB=B2=84=ED=8A=BC=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EB=A7=A8=20=EC=9C=84=EB=A1=9C=20=EA=B0=80=EB=8A=94?= =?UTF-8?q?=20=EC=95=A1=EC=85=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController/likedStudiosViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index 4ff5753..0ca604d 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -64,7 +64,7 @@ final class LikedStudiosViewController: UIViewController { // MARK: - @objc @objc func upButtonDidTap(_ sender: UIButton) { - // TODO: - 버튼 액션 처리 + studiosCollectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true) } // MARK: - Custom Method From c3d58ce96d591ed19363838d6406214c3c351fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 03:02:33 +0900 Subject: [PATCH 15/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=ED=95=9C=20=ED=98=84=EC=83=81=EC=86=8C=20?= =?UTF-8?q?=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20=EB=B7=B0=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=95=A0?= =?UTF-8?q?=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index 0ca604d..cfe8142 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -13,17 +13,21 @@ import Then final class LikedStudiosViewController: UIViewController { // MARK: - Properties var likedStudiosList: [LikedStudio] = [] + var lastPanPositionOffset: CGFloat = 0 // MARK: - UI Properties private let navigationBar = FilinNavigationBar() - private let headerView = UIView() + + private let headerView = UIView().then { + $0.backgroundColor = .fillinBlack + } private lazy var studiosCollectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.isScrollEnabled = true - collectionView.backgroundColor = .black + collectionView.backgroundColor = .fillinBlack return collectionView }() @@ -64,7 +68,7 @@ final class LikedStudiosViewController: UIViewController { // MARK: - @objc @objc func upButtonDidTap(_ sender: UIButton) { - studiosCollectionView.setContentOffset(CGPoint(x: 0, y: 0), animated: true) + studiosCollectionView.setContentOffset(.zero, animated: true) } // MARK: - Custom Method @@ -107,6 +111,8 @@ extension LikedStudiosViewController { layoutHeaderView() layoutStudiosCollectionView() layoutFloatingUpButton() + view.bringSubviewToFront(headerView) + view.bringSubviewToFront(navigationBar) } private func layoutNavigaionBar() { @@ -147,7 +153,7 @@ extension LikedStudiosViewController { private func layoutStudiosCollectionView() { view.addSubview(studiosCollectionView) studiosCollectionView.snp.makeConstraints { - $0.top.equalTo(headerView.snp.bottom) + $0.top.equalTo(navigationBar.snp.bottom) $0.leading.bottom.trailing.equalToSuperview() } } @@ -166,6 +172,20 @@ extension LikedStudiosViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // TODO: - 뷰 전환 } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview) + var constantY: CGFloat + if actualPosition.y == lastPanPositionOffset { + constantY = 0 + } else { + constantY = actualPosition.y < 0 ? -50 : 0 + } + UIView.animate(withDuration: 0.25) { + self.headerView.transform = CGAffineTransform(translationX: 0, y: constantY) + } + lastPanPositionOffset = actualPosition.y + } } // MARK: - UICollectionViewDataSource @@ -191,4 +211,8 @@ extension LikedStudiosViewController: UICollectionViewDelegateFlowLayout { return cellSize } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0) + } } From e88ae4d573c3b71f2082bc31eb1520da6b111b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 03:12:28 +0900 Subject: [PATCH 16/17] =?UTF-8?q?=E2=9C=A8[FEAT]=20#146=20-=20=EC=85=80=20?= =?UTF-8?q?=EB=88=8C=EB=A0=80=EC=9D=84=20=EB=95=8C=20=EB=B7=B0=EC=A0=84?= =?UTF-8?q?=ED=99=98=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../likedStudiosViewController.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift index cfe8142..ff72f22 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/MyPageViewController/likedStudiosViewController/likedStudiosViewController.swift @@ -170,7 +170,12 @@ extension LikedStudiosViewController { // MARK: - UICollectionViewDelegate extension LikedStudiosViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - // TODO: - 뷰 전환 + let selectedStudioId = likedStudiosList[indexPath.row].id + NotificationCenter.default.post(name: NSNotification.Name("GetLatLng"), object: selectedStudioId, userInfo: nil) + let studioMapViewController = StudioMapViewController(contentViewController: StudioMapContentViewController()) + studioMapViewController.modalTransitionStyle = .coverVertical + studioMapViewController.modalPresentationStyle = .fullScreen + self.present(studioMapViewController, animated: true, completion: nil) } func scrollViewDidScroll(_ scrollView: UIScrollView) { From 83b01aced60b8f3dac420c20c8b2130b59dccaa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=86=B7=E1=84=8C=E1=85=AE=E1=84=86?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Fri, 20 Jan 2023 03:23:24 +0900 Subject: [PATCH 17/17] =?UTF-8?q?=E2=9C=85[CHORE]=20#146=20-=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=A0=84=ED=99=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/UIViewController+Extension.swift | 10 ++++++++++ .../StudioMapViewController.swift | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Fillin-iOS/Fillin-iOS/Resources/Extensions/UIViewController+Extension.swift b/Fillin-iOS/Fillin-iOS/Resources/Extensions/UIViewController+Extension.swift index 48c8ffd..a3c9410 100644 --- a/Fillin-iOS/Fillin-iOS/Resources/Extensions/UIViewController+Extension.swift +++ b/Fillin-iOS/Fillin-iOS/Resources/Extensions/UIViewController+Extension.swift @@ -44,4 +44,14 @@ extension UIViewController { self.present(alertViewController, animated: true, completion: completion) } + + func changeRootViewController(_ viewControllerToPresent: UIViewController) { + if let window = UIApplication.shared.windows.first { + window.rootViewController = viewControllerToPresent + UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: nil) + } else { + viewControllerToPresent.modalPresentationStyle = .overFullScreen + self.present(viewControllerToPresent, animated: true, completion: nil) + } + } } diff --git a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift index ebcf163..f30ee2d 100644 --- a/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift +++ b/Fillin-iOS/Fillin-iOS/Sources/ViewControllers/StudioMapViewController/StudioMapViewController.swift @@ -174,7 +174,7 @@ extension StudioMapViewController { private func setUpNavigationBar() { self.navigationController?.navigationBar.isHidden = true - navigationBar.popViewController = { self.navigationController?.popViewController(animated: true) } + navigationBar.popViewController = { self.changeRootViewController(HomeViewController()) } } private func setLatLngNotification() {