From 4674a761e51e48b7832cdcb9f2d2022aaef628fd Mon Sep 17 00:00:00 2001 From: corykim0829 Date: Wed, 29 Apr 2020 05:39:13 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=EB=B7=B0=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 Issue: #38 --- .../SideDishApp.xcodeproj/project.pbxproj | 4 + .../circle.fill.symbolset/Contents.json | 12 ++ .../circle.fill.symbolset/circle.fill.svg | 160 ++++++++++++++++++ .../DetailViewController.swift | 18 +- .../ThumbnailsPageViewController.swift | 16 ++ .../Views/Detail/ImageIndexStackView.swift | 70 ++++++++ 6 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/Contents.json create mode 100644 ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/circle.fill.svg create mode 100644 ios/SideDishApp/SideDishApp/Views/Detail/ImageIndexStackView.swift diff --git a/ios/SideDishApp/SideDishApp.xcodeproj/project.pbxproj b/ios/SideDishApp/SideDishApp.xcodeproj/project.pbxproj index dee9417..9bba1b5 100644 --- a/ios/SideDishApp/SideDishApp.xcodeproj/project.pbxproj +++ b/ios/SideDishApp/SideDishApp.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 1086E9822A6C8F6DE6E91752 /* Pods_SideDishApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F73413738BBF5BACBA69C851 /* Pods_SideDishApp.framework */; }; 3812772124574FAC000BDF82 /* ThumbnailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3812772024574FAC000BDF82 /* ThumbnailViewController.swift */; }; 381D92FA245174C30067C07A /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 381D92F9245174C30067C07A /* DetailViewController.swift */; }; + 3825BC732458B798004F5DE0 /* ImageIndexStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3825BC722458B798004F5DE0 /* ImageIndexStackView.swift */; }; 385E343A2452016B00931F8B /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385E34392452016B00931F8B /* NetworkManager.swift */; }; 3868CC4D244F17F6008DEC81 /* PriceLabelsStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3868CC4C244F17F6008DEC81 /* PriceLabelsStackView.swift */; }; 3868CC4F244F18E3008DEC81 /* OriginalPriceLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3868CC4E244F18E3008DEC81 /* OriginalPriceLabel.swift */; }; @@ -43,6 +44,7 @@ 1358D50A20262260DC847020 /* Pods-SideDishApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideDishApp.debug.xcconfig"; path = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp.debug.xcconfig"; sourceTree = ""; }; 3812772024574FAC000BDF82 /* ThumbnailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailViewController.swift; sourceTree = ""; }; 381D92F9245174C30067C07A /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 3825BC722458B798004F5DE0 /* ImageIndexStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageIndexStackView.swift; sourceTree = ""; }; 385E34392452016B00931F8B /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 3868CC4C244F17F6008DEC81 /* PriceLabelsStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceLabelsStackView.swift; sourceTree = ""; }; 3868CC4E244F18E3008DEC81 /* OriginalPriceLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OriginalPriceLabel.swift; sourceTree = ""; }; @@ -205,6 +207,7 @@ children = ( 38D7B8FA2451BCCD00F71799 /* OrderButton.swift */, 38BB4B062458102300B86451 /* DetailImagesStackView.swift */, + 3825BC722458B798004F5DE0 /* ImageIndexStackView.swift */, ); path = Detail; sourceTree = ""; @@ -362,6 +365,7 @@ files = ( 38E2FCD52457456400817780 /* ThumbnailsPageViewController.swift in Sources */, 388C14AF244E936E003323F2 /* SideDishProductsViewController.swift in Sources */, + 3825BC732458B798004F5DE0 /* ImageIndexStackView.swift in Sources */, 3868CC4F244F18E3008DEC81 /* OriginalPriceLabel.swift in Sources */, 38E2FCD32456F4E300817780 /* Detail.swift in Sources */, 388C14C2244EBD53003323F2 /* ProductCell.swift in Sources */, diff --git a/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/Contents.json b/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/Contents.json new file mode 100644 index 0000000..20a0a84 --- /dev/null +++ b/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/Contents.json @@ -0,0 +1,12 @@ +{ + "symbols" : [ + { + "idiom" : "universal", + "filename" : "circle.fill.svg" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/circle.fill.svg b/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/circle.fill.svg new file mode 100644 index 0000000..1d7eba1 --- /dev/null +++ b/ios/SideDishApp/SideDishApp/Assets.xcassets/circle.fill.symbolset/circle.fill.svg @@ -0,0 +1,160 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the width of the blue rectangles. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.1.0 + Generated from circle.fill + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/SideDishApp/SideDishApp/ViewControllers/DetailViewController.swift b/ios/SideDishApp/SideDishApp/ViewControllers/DetailViewController.swift index 5c0697e..a7c1202 100644 --- a/ios/SideDishApp/SideDishApp/ViewControllers/DetailViewController.swift +++ b/ios/SideDishApp/SideDishApp/ViewControllers/DetailViewController.swift @@ -20,7 +20,7 @@ class DetailViewController: UIViewController { @IBOutlet weak var deliveryFeeLabel: UILabel! @IBOutlet weak var deliveryInfoLabel: UILabel! @IBOutlet weak var detailImagesStackView: DetailImagesStackView! - + private var imageIndexStackView = ImageIndexStackView() @IBOutlet weak var gradientLayerContainerView: UIView! let thumbnailPageViewController = ThumbnailsPageViewController() @@ -38,11 +38,26 @@ class DetailViewController: UIViewController { configureScrollView() } + private func configureImageIndexStackView() { + scrollView.addSubview(imageIndexStackView) + imageIndexStackView.translatesAutoresizingMaskIntoConstraints = false + imageIndexStackView.bottomAnchor.constraint(equalTo: thumbnailPageViewController.view!.bottomAnchor, constant: -12).isActive = true + let indexStackLeading = imageIndexStackView.leadingAnchor.constraint(equalTo: thumbnailPageViewController.view!.leadingAnchor) + indexStackLeading.isActive = true + indexStackLeading.priority = .defaultLow + let indexStackTrailing = imageIndexStackView.trailingAnchor.constraint(equalTo: thumbnailPageViewController.view!.trailingAnchor) + indexStackTrailing.isActive = true + indexStackTrailing.priority = .defaultLow + imageIndexStackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true + imageIndexStackView.heightAnchor.constraint(equalToConstant: ImageIndexStackView.indexWidth).isActive = true + } + override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() let thumbnailPageView = thumbnailPageViewController.view! thumbnailPageView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width) + configureImageIndexStackView() } private func configureScrollView() { @@ -57,6 +72,7 @@ class DetailViewController: UIViewController { func configureDetailViewController(title: String, with detail: Detail) { thumbnailPageViewController.configureImageURLs(detail.thumbnailImageURLs) + imageIndexStackView.configureSubViews(count: detail.thumbnailImageURLs.count) titleLabel.text = title descriptionLabel.text = detail.description pointLabel.text = detail.point diff --git a/ios/SideDishApp/SideDishApp/ViewControllers/ThumbnailsPageViewController.swift b/ios/SideDishApp/SideDishApp/ViewControllers/ThumbnailsPageViewController.swift index f66aca0..5161509 100644 --- a/ios/SideDishApp/SideDishApp/ViewControllers/ThumbnailsPageViewController.swift +++ b/ios/SideDishApp/SideDishApp/ViewControllers/ThumbnailsPageViewController.swift @@ -34,6 +34,7 @@ class ThumbnailsPageViewController: UIPageViewController { super.viewDidLoad() dataSource = self + delegate = self configureUI() } @@ -69,3 +70,18 @@ extension ThumbnailsPageViewController: UIPageViewControllerDataSource { return thumbnailViewControllers[index + 1] } } + +extension ThumbnailsPageViewController: UIPageViewControllerDelegate { + + static let IndexChangedNotification = Notification.Name(rawValue: "IndexChangedNotification") + + func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + guard completed else { return } + let index = thumbnailViewControllers.firstIndex(where: { $0 == pageViewController.viewControllers?.first }) ?? 0 + postNotification(index: index) + } + + private func postNotification(index: Int) { + NotificationCenter.default.post(name: Self.IndexChangedNotification, object: nil, userInfo: ["index": index]) + } +} diff --git a/ios/SideDishApp/SideDishApp/Views/Detail/ImageIndexStackView.swift b/ios/SideDishApp/SideDishApp/Views/Detail/ImageIndexStackView.swift new file mode 100644 index 0000000..ee5ec9c --- /dev/null +++ b/ios/SideDishApp/SideDishApp/Views/Detail/ImageIndexStackView.swift @@ -0,0 +1,70 @@ +// +// ImageIndexStackView.swift +// SideDishApp +// +// Created by Cory Kim on 2020/04/29. +// Copyright © 2020 corykim0829. All rights reserved. +// + +import UIKit + +class ImageIndexStackView: UIStackView { + + static let indexWidth: CGFloat = 6 + private var indexViews = [UIView]() + + private var index: Int = 0 { + didSet { + indexViews.forEach { $0.alpha = 0.4 } + indexViews[index].alpha = 1 + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + configureStackView() + configureNotification() + } + + required init(coder: NSCoder) { + super.init(coder: coder) + configureStackView() + configureNotification() + } + + func configureSubViews(count: Int) { + self.removeAll() + for _ in 0..