├── .github
├── ISSUE_TEMPLATE
│ └── 이슈-템플릿.md
└── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── README.md
└── Tabling-iOS
├── .swiftlint.yml
├── Tabling-iOS.xcodeproj
└── project.pbxproj
└── Tabling-iOS
├── Application
├── AppDelegate.swift
└── SceneDelegate.swift
├── ExampleCollectionViewCell.swift
├── Global
├── Extension
│ ├── NSObject+.swift
│ ├── UIColor+.swift
│ ├── UIImage+.swift
│ ├── UILabel+.swift
│ ├── UIStackView+.swift
│ └── UIView+.swift
├── Literals
│ ├── ColorLiterals.swift
│ ├── FontLiterals.swift
│ ├── ImageLiterals.swift
│ └── StringLiterals.swift
├── Protocols
│ ├── UICollectionViewRegisterable.swift
│ └── UITableViewRegisterable.swift
├── Resources
│ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ └── logo.png
│ │ ├── Contents.json
│ │ ├── btn_all_menu_look.imageset
│ │ │ ├── Contents.json
│ │ │ ├── btn_normal.png
│ │ │ ├── btn_normal@2x.png
│ │ │ └── btn_normal@3x.png
│ │ ├── btn_all_review_look.imageset
│ │ │ ├── Contents.json
│ │ │ ├── btn_normal.png
│ │ │ ├── btn_normal@2x.png
│ │ │ └── btn_normal@3x.png
│ │ ├── divider_narrow_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── divider_narrow_ios.png
│ │ │ ├── divider_narrow_ios@2x.png
│ │ │ └── divider_narrow_ios@3x.png
│ │ ├── divider_wide_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── divider_wide_ios.png
│ │ │ ├── divider_wide_ios@2x.png
│ │ │ └── divider_wide_ios@3x.png
│ │ ├── ic_car.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_car.png
│ │ │ ├── ic_car@2x.png
│ │ │ └── ic_car@3x.png
│ │ ├── ic_chevron_left_black.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_chevron_left_black.png
│ │ │ ├── ic_chevron_left_black@2x.png
│ │ │ └── ic_chevron_left_black@3x.png
│ │ ├── ic_chevron_left_white.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_chevron_left_white.png
│ │ │ ├── ic_chevron_left_white@2x.png
│ │ │ └── ic_chevron_left_white@3x.png
│ │ ├── ic_chevron_right_black.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_chevron_right_black.png
│ │ │ ├── ic_chevron_right_black@2x.png
│ │ │ └── ic_chevron_right_black@3x.png
│ │ ├── ic_couple.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_couple.png
│ │ │ ├── ic_couple@2x.png
│ │ │ └── ic_couple@3x.png
│ │ ├── ic_heart_black.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_heart_black.png
│ │ │ ├── ic_heart_black@2x.png
│ │ │ └── ic_heart_black@3x.png
│ │ ├── ic_heart_white.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_heart_white.png
│ │ │ ├── ic_heart_white@2x.png
│ │ │ └── ic_heart_white@3x.png
│ │ ├── ic_info.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_info.png
│ │ │ ├── ic_info@2x.png
│ │ │ └── ic_info@3x.png
│ │ ├── ic_minus_able.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_minus.png
│ │ │ ├── ic_minus@2x.png
│ │ │ └── ic_minus@3x.png
│ │ ├── ic_minus_disable.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_minus.png
│ │ │ ├── ic_minus@2x.png
│ │ │ └── ic_minus@3x.png
│ │ ├── ic_more.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_more.png
│ │ │ ├── ic_more@2x.png
│ │ │ └── ic_more@3x.png
│ │ ├── ic_more_bc.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_more_bc.png
│ │ │ ├── ic_more_bc@2x.png
│ │ │ └── ic_more_bc@3x.png
│ │ ├── ic_people.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_people.png
│ │ │ ├── ic_people@2x.png
│ │ │ └── ic_people@3x.png
│ │ ├── ic_plus.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_plus.png
│ │ │ ├── ic_plus@2x.png
│ │ │ └── ic_plus@3x.png
│ │ ├── ic_polygon.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_polygon.png
│ │ │ ├── ic_polygon@2x.png
│ │ │ └── ic_polygon@3x.png
│ │ ├── ic_refresh_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_refresh_ios.png
│ │ │ ├── ic_refresh_ios@2x.png
│ │ │ └── ic_refresh_ios@3x.png
│ │ ├── ic_selected.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_selected.png
│ │ │ ├── ic_selected@2x.png
│ │ │ └── ic_selected@3x.png
│ │ ├── ic_share_black.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_share_black.png
│ │ │ ├── ic_share_black@2x.png
│ │ │ └── ic_share_black@3x.png
│ │ ├── ic_share_white.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_share_white.png
│ │ │ ├── ic_share_white@2x.png
│ │ │ └── ic_share_white@3x.png
│ │ ├── ic_waiting.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_waiting.png
│ │ │ ├── ic_waiting@2x.png
│ │ │ └── ic_waiting@3x.png
│ │ ├── ic_wifi.imageset
│ │ │ ├── Contents.json
│ │ │ ├── ic_wifi.png
│ │ │ ├── ic_wifi@2x.png
│ │ │ └── ic_wifi@3x.png
│ │ ├── icon_exit_circle.imageset
│ │ │ ├── Contents.json
│ │ │ ├── icon_exit_circle.png
│ │ │ ├── icon_exit_circle@2x.png
│ │ │ └── icon_exit_circle@3x.png
│ │ ├── icon_star_colored.imageset
│ │ │ ├── Contents.json
│ │ │ ├── icon_star_colored.png
│ │ │ ├── icon_star_colored@2x.png
│ │ │ └── icon_star_colored@3x.png
│ │ ├── icon_star_gray.imageset
│ │ │ ├── Contents.json
│ │ │ ├── icon_star_gray.png
│ │ │ ├── icon_star_gray@2x.png
│ │ │ └── icon_star_gray@3x.png
│ │ ├── tag_call_detail_1.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_call_detail_1.png
│ │ │ ├── tag_call_detail_1@2x.png
│ │ │ └── tag_call_detail_1@3x.png
│ │ ├── tag_canceled_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_canceled_ios.png
│ │ │ ├── tag_canceled_ios@2x.png
│ │ │ └── tag_canceled_ios@3x.png
│ │ ├── tag_completed_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_completed_ios.png
│ │ │ ├── tag_completed_ios@2x.png
│ │ │ └── tag_completed_ios@3x.png
│ │ ├── tag_location_detail_1.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_location_detail_1.png
│ │ │ ├── tag_location_detail_1@2x.png
│ │ │ └── tag_location_detail_1@3x.png
│ │ ├── tag_noshow_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_noshow_ios.png
│ │ │ ├── tag_noshow_ios@2x.png
│ │ │ └── tag_noshow_ios@3x.png
│ │ ├── tag_planned_ios.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_planned_ios.png
│ │ │ ├── tag_planned_ios@2x.png
│ │ │ └── tag_planned_ios@3x.png
│ │ ├── tag_store_detail_1.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tag_store_detail_1.png
│ │ │ ├── tag_store_detail_1@2x.png
│ │ │ └── tag_store_detail_1@3x.png
│ │ └── tdesign_pen-ball.imageset
│ │ │ ├── Contents.json
│ │ │ ├── tdesign_pen-ball.png
│ │ │ ├── tdesign_pen-ball@2x.png
│ │ │ └── tdesign_pen-ball@3x.png
│ └── Font
│ │ ├── Pretendard-Regular.otf
│ │ └── Pretendard-SemiBold.otf
└── Supporting Files
│ └── Base.lproj
│ └── LaunchScreen.storyboard
├── Info.plist
├── Network
├── Base
│ ├── BaseService.swift
│ ├── GenericResponse.swift
│ ├── NetworkConstant.swift
│ ├── NetworkResult.swift
│ └── URLConstant.swift
├── Entity
│ ├── StoreDetail
│ │ ├── ReserveEntity.swift
│ │ └── StoreDetailEntity.swift
│ ├── StoreList
│ │ ├── LocationData.swift
│ │ └── StoreListEntity.swift
│ ├── TablingList
│ │ ├── CompleteEntity.swift
│ │ └── TablingListEntity.swift
│ └── WaitingDetail
│ │ └── WaitingDetailEntity.swift
├── Enviornment
│ └── Config.swift
└── Services
│ ├── StoreDetailService.swift
│ ├── StoreListService.swift
│ ├── TablingListService.swift
│ └── WaitingDetailService.swift
├── Presentation
├── ReserveAlert
│ ├── View
│ │ └── ReserveAlertView.swift
│ └── ViewController
│ │ └── ReserveAlertViewController.swift
├── ReserveBottomSheet
│ ├── View
│ │ └── ReserveBottomSheetView.swift
│ └── ViewController
│ │ └── ReserveBottomSheetViewController.swift
├── StoreDetail
│ ├── Cell
│ │ ├── DetailStarTableViewCell.swift
│ │ ├── LeftAlignedCollectionViewFlowLayout.swift
│ │ ├── MenuCollectionHeaderView.swift
│ │ ├── MenuCollectionViewCell.swift
│ │ ├── RecentReviewTableViewCell.swift
│ │ ├── StoreDetailImageCollectionViewCell.swift
│ │ └── StoreTagCollectionViewCell.swift
│ ├── View
│ │ ├── AllMenuView.swift
│ │ ├── CustomTabBarHeaderView.swift
│ │ ├── HomeView.swift
│ │ ├── ImageScrollCollectionView.swift
│ │ ├── RecentReviewView.swift
│ │ ├── StoreDetailBottomTabView.swift
│ │ └── StoreDetailView.swift
│ └── ViewController
│ │ └── StoreDetailViewController.swift
├── StoreList
│ ├── Cell
│ │ ├── LocationCollectionViewCell.swift
│ │ ├── StoreListCollectionHeaderView.swift
│ │ └── StoreListCollectionViewCell.swift
│ ├── View
│ │ ├── LocationCollectionView.swift
│ │ ├── StoreListCollectionView.swift
│ │ └── StoreListView.swift
│ └── ViewController
│ │ └── StoreListViewController.swift
├── TablingList
│ ├── Cell
│ │ └── CompleteCollectionViewCell.swift
│ ├── View
│ │ ├── CancelCollectionView.swift
│ │ ├── CompleteCollectionView.swift
│ │ └── TablingListView.swift
│ └── ViewController
│ │ └── TablingListViewController.swift
└── WaitingDetail
│ ├── View
│ └── WaitingDetailView.swift
│ └── ViewController
│ └── WaitingDetailViewController.swift
├── View.swift
└── ViewController.swift
/.github/ISSUE_TEMPLATE/이슈-템플릿.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: 이슈 템플릿
3 | about: "테이블링 아요 이슈 템플릿\U0001F374"
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | ## 🛠 Issue
11 |
12 |
13 | ## 📝 To-do
14 |
15 | - [ ] todo!
16 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## 🔥*Pull requests*
2 |
3 | 👷 **작업한 내용**
4 |
5 |
6 | 🚨 **참고 사항**
7 |
8 |
9 | 📸 **스크린샷**
10 | |기능|스크린샷|
11 | |:--:|:--:|
12 | |GIF|
|
13 |
14 | 📟 **관련 이슈**
15 | - Resolved: #이슈번호
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ### macOS ###
9 | # General
10 | .DS_Store
11 | .AppleDouble
12 | .LSOverride
13 |
14 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
15 | *.xcscmblueprint
16 | *.xccheckout
17 | *.xcconfig
18 |
19 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
20 | build/
21 | DerivedData/
22 | *.moved-aside
23 | *.pbxuser
24 | !default.pbxuser
25 | *.mode1v3
26 | !default.mode1v3
27 | *.mode2v3
28 | !default.mode2v3
29 | *.perspectivev3
30 | !default.perspectivev3
31 |
32 | ## Obj-C/Swift specific
33 | *.hmap
34 |
35 | ## App packaging
36 | *.ipa
37 | *.dSYM.zip
38 | *.dSYM
39 |
40 | ## Playgrounds
41 | timeline.xctimeline
42 | playground.xcworkspace
43 |
44 | # Swift Package Manager
45 | #
46 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
47 | # Packages/
48 | # Package.pins
49 | # Package.resolved
50 | # *.xcodeproj
51 | #
52 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
53 | # hence it is not needed unless you have added a package configuration file to your project
54 | # .swiftpm
55 |
56 | .build/
57 |
58 | # CocoaPods
59 | #
60 | # We recommend against adding the Pods directory to your .gitignore. However
61 | # you should judge for yourself, the pros and cons are mentioned at:
62 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
63 | #
64 | Pods/
65 | #
66 | # Add this line if you want to avoid checking in source code from the Xcode workspace
67 | *.xcworkspace
68 |
69 | # Carthage
70 | #
71 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
72 | # Carthage/Checkouts
73 |
74 | Carthage/Build/
75 |
76 | # Accio dependency management
77 | Dependencies/
78 | .accio/
79 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tabling-iOS
2 | - 33기 DO SOPT 클디서 합동 세미나 앱 9조
3 | - 아요 레포 테이블링 필수🍴
4 |
5 | ### 👩👧👦팀원 소개
6 |
7 | | [아라](https://github.com/ahra1221) | [민재](https://github.com/mini-min) | [연수](https://github.com/yeonsu0-0) |
8 | | :--: | :--: | :--: |
9 | |
|
|
|
10 | |
`원격줄서기내역` `대기신청완료팝업` |
`매장상세` `방문인원모달` |
`매장검색` `대기상세` |
11 |
12 |
13 |
14 | ### 📱 시연영상
15 |
16 |
17 |
18 |
19 |
20 | ### 📦 Libraries
21 | |Library|Version|Description|
22 | |:-----:|:-----:|:-----:|
23 | | [**SwiftLint**](https://github.com/realm/SwiftLint) | 0.54.0 | 같은 iOS 개발자 사이, 코딩 컨벤션 규칙을 설정하는 데 사용 |
24 | | [**Alamofire**](https://github.com/Alamofire/Alamofire) | 5.8.1 | HTTP Networking 연결시 사용 |
25 | | [**SnapKit**](https://github.com/SnapKit/SnapKit) | 5.6.0 | UI AutoLayout을 잡을 때 사용 |
26 |
27 |
28 |
29 | ### 📂 Foldering Convention
30 | ```bash
31 | ├── 📁 Application
32 | │ ├── AppDelegate
33 | │ ├── SceneDelegate
34 | ├── 📁 Global
35 | │ ├── 🗂️ Resources
36 | │ │ ├── 🗂️ Font
37 | │ │ ├── Assets
38 | │ ├── 🗂️ Literals
39 | │ ├── 🗂️ Extension
40 | │ ├── 🗂️ Protocols
41 | │ ├── 🗂️ Utils
42 | │ ├── 🗂️ Supporting Files
43 | │ │ ├── LaunchScreen
44 | ├── 📁 Network
45 | │ ├── 🗂️ Environment
46 | │ ├── 🗂️ Base
47 | │ ├── 🗂️ Entity
48 | │ ├── 🗂️ Services
49 | ├── 📁 Presentation
50 | │ ├── 🗂️ WaitingDetail
51 | │ ├── 🗂️ StoreDetail
52 | │ ├── 🗂️ StoreList
53 | │ ├── 🗂️ TablingList
54 | │ │ │ ├── 🗂️ Cell
55 | │ │ │ ├── 🗂️ View
56 | │ │ │ ├── 🗂️ ViewController
57 | ├── Info.plist
58 | ├── .swiftlint
59 | ```
60 |
61 | ### 🙌 Git Commit, Issue, PR Message Convention
62 | See [Git Commit, Issue, PR Message Convention Wiki](https://www.notion.so/Git-fb27a75c95b041f89ea0ed6ed2f5947d?pvs=4) page.
63 |
64 | ### 📖 Coding Convention
65 | See [Coding Convention Wiki](https://www.notion.so/Code-Convention-f21abc8840d2425aba525b5bed6b57f9?pvs=4) page.
66 |
67 | ### 🎋 Code Review Rule
68 | See [Git Branch Rule Wiki](https://www.notion.so/da65b45e71e94e4880e839df344c249c?pvs=4) page.
69 |
--------------------------------------------------------------------------------
/Tabling-iOS/.swiftlint.yml:
--------------------------------------------------------------------------------
1 | # 실행에서 제외할 룰 식별자
2 | disabled_rules:
3 | - line_length
4 | - trailing_whitespace
5 | - function_parameter_count
6 | - file_length
7 | - identifier_name
8 | - function_body_length
9 | - nesting
10 | # 린트 과정에서 무시할 파일 경로
11 | excluded:
12 | - Tabling-iOS/Application/AppDelegate.swift
13 | - Tabling-iOS/Application/SceneDelegate.swift
14 | - Tabling-iOS/View.swift
15 | - Tabling-iOS/ViewController.swift
16 | - Tabling-iOS/ExampleCollectionViewCell.swift
17 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Application/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | @main
11 | class AppDelegate: UIResponder, UIApplicationDelegate {
12 |
13 |
14 |
15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
16 | // Override point for customization after application launch.
17 | return true
18 | }
19 |
20 | // MARK: UISceneSession Lifecycle
21 |
22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
23 | // Called when a new scene session is being created.
24 | // Use this method to select a configuration to create the new scene with.
25 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
26 | }
27 |
28 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
29 | // Called when the user discards a scene session.
30 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
31 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
32 | }
33 |
34 |
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Application/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
11 |
12 | var window: UIWindow?
13 |
14 |
15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
16 | guard let windowScene = (scene as? UIWindowScene) else { return }
17 |
18 | let window = UIWindow(windowScene: windowScene)
19 | let rootVC = UINavigationController(rootViewController: StoreListViewController())
20 |
21 | window.rootViewController = rootVC
22 | window.makeKeyAndVisible()
23 | self.window = window
24 | }
25 |
26 | func sceneDidDisconnect(_ scene: UIScene) {
27 | // Called as the scene is being released by the system.
28 | // This occurs shortly after the scene enters the background, or when its session is discarded.
29 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
30 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
31 | }
32 |
33 | func sceneDidBecomeActive(_ scene: UIScene) {
34 | // Called when the scene has moved from an inactive state to an active state.
35 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
36 | }
37 |
38 | func sceneWillResignActive(_ scene: UIScene) {
39 | // Called when the scene will move from an active state to an inactive state.
40 | // This may occur due to temporary interruptions (ex. an incoming phone call).
41 | }
42 |
43 | func sceneWillEnterForeground(_ scene: UIScene) {
44 | // Called as the scene transitions from the background to the foreground.
45 | // Use this method to undo the changes made on entering the background.
46 | }
47 |
48 | func sceneDidEnterBackground(_ scene: UIScene) {
49 | // Called as the scene transitions from the foreground to the background.
50 | // Use this method to save data, release shared resources, and store enough scene-specific state information
51 | // to restore the scene back to its current state.
52 | }
53 |
54 |
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/ExampleCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ExampleCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/18.
6 | //
7 |
8 | import UIKit
9 |
10 | final class ExampleCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
11 |
12 | // MARK: - Properties
13 |
14 | // MARK: - UI Components
15 |
16 | // MARK: - Life Cycles
17 |
18 | override init(frame: CGRect) {
19 | super.init(frame: frame)
20 |
21 | setUI()
22 | setHierarchy()
23 | setLayout()
24 | }
25 |
26 | required init?(coder: NSCoder) {
27 | fatalError("init(coder:) has not been implemented")
28 | }
29 |
30 | // UITableViewCell인 경우
31 | // override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
32 | // super.init(style: style, reuseIdentifier: reuseIdentifier)
33 | //
34 | // setUI()
35 | // setHierarchy()
36 | // setLayout()
37 | // }
38 | // @available(*, unavailable)
39 | // required init?(coder: NSCoder) {
40 | // fatalError("init(coder:) has not been implemented")
41 | // }
42 | }
43 |
44 | // MARK: - Extensions
45 | extension ExampleCollectionViewCell {
46 | func setUI() {
47 |
48 | }
49 |
50 | func setHierarchy() {
51 |
52 | }
53 |
54 | func setLayout() {
55 |
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/NSObject+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSObject+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import Foundation
9 |
10 | extension NSObject {
11 | static var className: String {
12 | NSStringFromClass(self.classForCoder()).components(separatedBy: ".").last!
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/UIColor+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIColor+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 | convenience init(hex: String, alpha: CGFloat = 1.0) {
12 | var hexFormatted: String = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased()
13 |
14 | if hexFormatted.hasPrefix("#") {
15 | hexFormatted = String(hexFormatted.dropFirst())
16 | }
17 |
18 | assert(hexFormatted.count == 6, "Invalid hex code used.")
19 | var rgbValue: UInt64 = 0
20 | Scanner(string: hexFormatted).scanHexInt64(&rgbValue)
21 |
22 | self.init(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
23 | green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
24 | blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: alpha)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/UIImage+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIImage+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/18.
6 | //
7 |
8 | import UIKit
9 |
10 | import Kingfisher
11 |
12 | extension UIImage {
13 | static func load(name: String) -> UIImage {
14 | guard let image = UIImage(named: name, in: nil, compatibleWith: nil) else {
15 | return UIImage()
16 | }
17 | image.accessibilityIdentifier = name
18 | return image
19 | }
20 | }
21 |
22 | extension UIImageView {
23 | func kfSetImage(url: String?) {
24 | guard let url = url else { return }
25 | if let url = URL(string: url) {
26 | kf.indicatorType = .activity
27 | kf.setImage(with: url,
28 | placeholder: nil,
29 | options: [.transition(.fade(1.0))],
30 | progressBlock: nil)
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/UILabel+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UILabel+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UILabel {
11 | // 특정 부분만 폰트, 색상 적용
12 | func partFontChange(targetString: String, font: UIFont, textColor: UIColor) {
13 | guard let existingText = self.text else {
14 | return
15 | }
16 | let existingAttributes = self.attributedText?.attributes(at: 0, effectiveRange: nil) ?? [:]
17 | let attributedStr = NSMutableAttributedString(string: existingText, attributes: existingAttributes)
18 | let range = (existingText as NSString).range(of: targetString)
19 | attributedStr.addAttribute(NSAttributedString.Key.font, value: font, range: range)
20 | attributedStr.addAttribute(NSAttributedString.Key.foregroundColor, value: textColor, range: range)
21 | self.attributedText = attributedStr
22 | }
23 |
24 | func partColorChange(targetString: String, textColor: UIColor) {
25 | guard let existingText = self.text else {
26 | return
27 | }
28 | let existingAttributes = self.attributedText?.attributes(at: 0, effectiveRange: nil) ?? [:]
29 | let attributedStr = NSMutableAttributedString(string: existingText, attributes: existingAttributes)
30 | let range = (existingText as NSString).range(of: targetString)
31 | attributedStr.addAttribute(NSAttributedString.Key.foregroundColor, value: textColor, range: range)
32 | self.attributedText = attributedStr
33 | }
34 |
35 | // 행간, 자간 조절 메소드
36 | func setLineAndCharacterSpacing(font: UIFont) {
37 | guard let existingText = self.text else {
38 | return
39 | }
40 | let existingAttributes = self.attributedText?.attributes(at: 0, effectiveRange: nil) ?? [:]
41 | let attributedStr = NSMutableAttributedString(string: existingText, attributes: existingAttributes)
42 | let style = NSMutableParagraphStyle()
43 | style.lineSpacing = 1.5
44 | attributedStr.addAttribute(NSAttributedString.Key.paragraphStyle,
45 | value: style,
46 | range: NSRange(location: 0, length: attributedStr.length))
47 | attributedStr.addAttribute(NSAttributedString.Key.kern,
48 | value: -0.025,
49 | range: NSRange(location: 0, length: attributedStr.length))
50 | attributedStr.addAttribute(NSAttributedString.Key.font, value: font, range: NSRange(location: 0, length: attributedStr.length))
51 |
52 | self.attributedText = attributedStr
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/UIStackView+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIStackView+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/20/23.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIStackView {
11 | func addArrangedSubviews(_ views: UIView...) {
12 | for view in views {
13 | self.addArrangedSubview(view)
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Extension/UIView+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIView {
11 | func addSubviews(_ views: UIView...) {
12 | views.forEach { self.addSubview($0) }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Literals/ColorLiterals.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ColorLiterals.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | extension UIColor {
11 | static var TablingPrimary: UIColor {
12 | return UIColor(hex: "#F85A40")
13 | }
14 |
15 | static var TablingSecondary1: UIColor {
16 | return UIColor(hex: "#0E74F6")
17 | }
18 |
19 | static var TablingSecondary2: UIColor {
20 | return UIColor(hex: "#85BAFF")
21 | }
22 |
23 | static var TablingWhite: UIColor {
24 | return UIColor(hex: "#FFFFFF")
25 | }
26 |
27 | static var GrayShadow: UIColor {
28 | return UIColor(hex: "#F1F1F1")
29 | }
30 |
31 | static var Gray000: UIColor {
32 | return UIColor(hex: "#F3F3F3")
33 | }
34 |
35 | static var Gray100: UIColor {
36 | return UIColor(hex: "#C3C3C6")
37 | }
38 |
39 | static var Gray200: UIColor {
40 | return UIColor(hex: "#9EA0A3")
41 | }
42 |
43 | static var Gray300: UIColor {
44 | return UIColor(hex: "#62646C")
45 | }
46 |
47 | static var Gray400: UIColor {
48 | return UIColor(hex: "#454751")
49 | }
50 |
51 | static var Gray500: UIColor {
52 | return UIColor(hex: "#2C2E34")
53 | }
54 |
55 | static var Gray600: UIColor {
56 | return UIColor(hex: "#202026")
57 | }
58 |
59 | static var Gray700: UIColor {
60 | return UIColor(hex: "#17171B")
61 | }
62 |
63 | static var Gray800: UIColor {
64 | return UIColor(hex: "#101012")
65 | }
66 |
67 | }
68 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Literals/FontLiterals.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FontLiterals.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/18.
6 | //
7 |
8 | import UIKit
9 |
10 | struct FontName {
11 | static let PretendardSemiBold = "Pretendard-SemiBold"
12 | static let PretendardRegular = "Pretendard-Regular"
13 | }
14 |
15 | extension UIFont {
16 | @nonobjc class func pretendardSemiBold(size: CGFloat) -> UIFont {
17 | return UIFont(name: FontName.PretendardSemiBold, size: size)!
18 | }
19 |
20 | @nonobjc class func pretendardRegular(size: CGFloat) -> UIFont {
21 | return UIFont(name: FontName.PretendardRegular, size: size)!
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Literals/ImageLiterals.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImageLiterals.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/18.
6 | //
7 |
8 | import UIKit
9 |
10 | enum ImageLiterals {
11 | enum Common {
12 | static var ic_back_b: UIImage { .load(name: "ic_chevron_left_black") }
13 | static var ic_back_w: UIImage { .load(name: "ic_chevron_left_white") }
14 | static var ic_refresh: UIImage { .load(name: "ic_refresh_ios") }
15 | static var ic_next: UIImage { .load(name: "ic_chevron_right_black") }
16 | static var devider_narrow: UIImage { .load(name: "divider_narrow_ios") }
17 | static var devider_wide: UIImage { .load(name: "divider_wide_ios") }
18 | static var ic_star_fill: UIImage { .load(name: "icon_star_colored") }
19 | static var ic_star_empty: UIImage { .load(name: "icon_star_gray") }
20 | }
21 |
22 | enum WaitingDetail {
23 | static var tag_call: UIImage { .load(name: "tag_call_detail_1") }
24 | static var tag_location: UIImage { .load(name: "tag_location_detail_1") }
25 | static var tag_storeDetail: UIImage { .load(name: "tag_store_detail_1") }
26 | }
27 |
28 | enum StoreDetail {
29 | static var ic_heart_b: UIImage { .load(name: "ic_heart_black") }
30 | static var ic_heart_w: UIImage { .load(name: "ic_heart_white") }
31 | static var ic_share_b: UIImage { .load(name: "ic_share_black") }
32 | static var ic_share_w: UIImage { .load(name: "ic_share_white") }
33 | static var ic_wifi: UIImage { .load(name: "ic_wifi") }
34 | static var ic_toilet: UIImage { .load(name: "ic_couple") }
35 | static var ic_parking: UIImage { .load(name: "ic_car") }
36 | static var ic_waiting: UIImage { .load(name: "ic_waiting") }
37 | static var ic_exit_circle: UIImage { .load(name: "icon_exit_circle") }
38 | static var ic_minus_able: UIImage { .load(name: "ic_minus_able") }
39 | static var ic_minus_disable: UIImage { .load(name: "ic_minus_disable") }
40 | static var ic_plus: UIImage { .load(name: "ic_plus") }
41 | static var ic_info: UIImage { .load(name: "ic_info") }
42 | static var btn_all_menu_look: UIImage { .load(name: "btn_all_menu_look") }
43 | static var btn_all_review_look: UIImage { .load(name: "btn_all_review_look") }
44 | }
45 |
46 | enum StoreList {
47 | static var ic_moreLocation: UIImage { .load(name: "ic_more") }
48 | static var ic_moreLocation_bg: UIImage { .load(name: "ic_more_bc") }
49 | static var ic_polygon: UIImage { .load(name: "ic_polygon") }
50 | static var ic_people: UIImage { .load(name: "ic_people") }
51 | }
52 |
53 | enum TablingList {
54 | static var ic_review: UIImage { .load(name: "tdesign_pen-ball") }
55 | static var tag_canceled: UIImage { .load(name: "tag_canceled_ios") }
56 | static var tag_completed: UIImage { .load(name: "tag_completed_ios") }
57 | static var tag_noshow: UIImage { .load(name: "tag_noshow_ios") }
58 | static var tag_planned: UIImage { .load(name: "tag_planned_ios") }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Literals/StringLiterals.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringLiterals.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/18.
6 | //
7 |
8 | import Foundation
9 |
10 | enum I18N {
11 |
12 | enum WaitingDetail {
13 | static let waitingInfoTitle = "대기정보"
14 | static let waitingDateTitle = "접수일시"
15 | static let waitingNumTitle = "대기번호"
16 | static let waitingheadCountTitle = "인원"
17 | static let waitingStatusTitle = "대기상태"
18 | static let totalSalesTitle = "총 금액"
19 | static let requestTitle = "요청사항"
20 | static let statusDoneLabel = "이용이 완료되었어요"
21 | static let statusIngLabel = "대기중이에요"
22 | }
23 |
24 | enum ReserveAlert {
25 | static let reserveTitle = "대기 신청 완료"
26 | static let waitingTitle = "대기번호"
27 | static let waitingNumTitle = "번"
28 | static let shopTitle = "매장명"
29 | static let personTitle = "인원"
30 | static let statusTitle = "신청상태"
31 | static let reserveButtonTitle = "대기 내역 확인하기"
32 | }
33 |
34 | enum StoreDetail {
35 | static let lookMapButtonTitle = "지도보기"
36 | static let homeSegmentControlTitle = "홈"
37 | static let menuSegmentControlTitle = "전체메뉴"
38 | static let reviewSegmentControlTitle = "최근리뷰"
39 | static let tablingButtonTitle = "원격줄서기"
40 | static let reservationButtonTitle = "예약 불가"
41 | static let orederButtonTitle = "주문 불가"
42 | static let allMenuTitle = "전체 메뉴"
43 | static let testLabel = "test"
44 | static let detailTitle1 = "음식 맛"
45 | static let detailTitle2 = "분위기"
46 | static let detailTitle3 = "친절도"
47 | static let detailTitle4 = "청결상태"
48 | static let averageTitle = "전체 평점"
49 | static let salesInfoTitle = "영업정보"
50 | static let salesTimeInfoTitle = "운영시간"
51 | static let salesWaitTimeInfoTitle = "원격줄서기"
52 | static let salesRestTimeInfoTitle = "휴식시간"
53 | static let salesDayoffInfoTitle = "휴무일"
54 | static let salesPhoneInfoTitle = "전화번호"
55 | static let storePickTagTitle = "매장 PICK!"
56 | static let amenityTitle = "편의시설"
57 | static let introduceStoreTitle = "매장소개"
58 | }
59 |
60 | enum ReserveBottomSheet {
61 | static let personChoiceTitle = "방문 인원을 선택하세요"
62 | static let personTitle = "인원"
63 | static let tablingButtonTitle = "대기 신청하기"
64 | }
65 |
66 | enum StoreList {
67 | static let storeTestLabel = "test"
68 | }
69 |
70 | enum TablingList {
71 | static let navigationBarTitle = "원격 줄서기 내역"
72 | static let segementTitle1 = "이용예정/완료"
73 | static let segementTitle2 = "취소/노쇼"
74 | static let statusPlanTitle = "이용예정"
75 | static let statusCompleteTitle = "이용완료"
76 | static let detailButtonTitle = "상세보기"
77 | static let testLabel = "test"
78 | static let beforeCountTitle = "현재 내 앞 대기"
79 | static let delayButtonTitle = "내 순서 미루기"
80 | static let confirmButtonTitle = "확정 코드 입력하기"
81 | static let cancelButtonTitle = "주문 취소"
82 | static let reviewButtonTitle = "리뷰쓰기"
83 | static let reviewEndTitle = "리뷰 작성 기간이 지났어요."
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Protocols/UICollectionViewRegisterable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UICollectionViewRegisterable.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | public protocol UICollectionViewRegisterable where Self: UICollectionViewCell {
11 | static func register(collectionView: UICollectionView)
12 | static func dequeueReusableCell(collectionView: UICollectionView, indexPath: IndexPath) -> Self
13 | static var reuseIdentifier: String { get }
14 | }
15 |
16 | extension UICollectionViewRegisterable {
17 | public static func register(collectionView: UICollectionView) {
18 | collectionView.register(self, forCellWithReuseIdentifier: self.reuseIdentifier)
19 | }
20 |
21 | public static func dequeueReusableCell(collectionView: UICollectionView, indexPath: IndexPath) -> Self {
22 | guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifier, for: indexPath) as? Self else { fatalError()}
23 | return cell
24 | }
25 |
26 | public static var reuseIdentifier: String {
27 | return String(describing: self)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Protocols/UITableViewRegisterable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITableViewRegisterable.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | public protocol UITableViewRegisterable where Self: UITableViewCell {
11 | static func register(tableView: UITableView)
12 | static func dequeueReusableCell(tableView: UITableView) -> Self
13 | static var reuseIdentifier: String { get }
14 | }
15 |
16 | extension UITableViewRegisterable {
17 | public static func register(tableView: UITableView) {
18 | tableView.register(Self.self, forCellReuseIdentifier: self.reuseIdentifier)
19 | }
20 |
21 | public static func dequeueReusableCell(tableView: UITableView) -> Self {
22 | guard let cell = tableView.dequeueReusableCell(withIdentifier: self.reuseIdentifier) as? Self else { fatalError("Error! \(self.reuseIdentifier)") }
23 | return cell
24 | }
25 |
26 | public static var reuseIdentifier: String {
27 | return String(describing: self)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "logo.png",
5 | "idiom" : "universal",
6 | "platform" : "ios",
7 | "size" : "1024x1024"
8 | }
9 | ],
10 | "info" : {
11 | "author" : "xcode",
12 | "version" : 1
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/AppIcon.appiconset/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/AppIcon.appiconset/logo.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "btn_normal.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "btn_normal@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "btn_normal@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_menu_look.imageset/btn_normal@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "btn_normal.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "btn_normal@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "btn_normal@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/btn_all_review_look.imageset/btn_normal@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "divider_narrow_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "divider_narrow_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "divider_narrow_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_narrow_ios.imageset/divider_narrow_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "divider_wide_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "divider_wide_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "divider_wide_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/divider_wide_ios.imageset/divider_wide_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_car.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_car@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_car@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_car.imageset/ic_car@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_chevron_left_black.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_chevron_left_black@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_chevron_left_black@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_black.imageset/ic_chevron_left_black@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_chevron_left_white.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_chevron_left_white@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_chevron_left_white@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_left_white.imageset/ic_chevron_left_white@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_chevron_right_black.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_chevron_right_black@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_chevron_right_black@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_chevron_right_black.imageset/ic_chevron_right_black@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_couple.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_couple@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_couple@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_couple.imageset/ic_couple@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_heart_black.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_heart_black@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_heart_black@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_black.imageset/ic_heart_black@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_heart_white.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_heart_white@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_heart_white@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_heart_white.imageset/ic_heart_white@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_info.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_info@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_info@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_info.imageset/ic_info@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_minus.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_minus@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_minus@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_able.imageset/ic_minus@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_minus.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_minus@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_minus@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_minus_disable.imageset/ic_minus@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_more.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_more@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_more@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more.imageset/ic_more@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_more_bc.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_more_bc@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_more_bc@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_more_bc.imageset/ic_more_bc@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_people.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_people@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_people@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_people.imageset/ic_people@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_plus.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_plus@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_plus@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_plus.imageset/ic_plus@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_polygon.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_polygon@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_polygon@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_polygon.imageset/ic_polygon@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_refresh_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_refresh_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_refresh_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_refresh_ios.imageset/ic_refresh_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_selected.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_selected@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_selected@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_selected.imageset/ic_selected@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_share_black.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_share_black@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_share_black@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_black.imageset/ic_share_black@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_share_white.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_share_white@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_share_white@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_share_white.imageset/ic_share_white@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_waiting.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_waiting@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_waiting@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_waiting.imageset/ic_waiting@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ic_wifi.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "ic_wifi@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "ic_wifi@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/ic_wifi.imageset/ic_wifi@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon_exit_circle.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icon_exit_circle@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icon_exit_circle@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_exit_circle.imageset/icon_exit_circle@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon_star_colored.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icon_star_colored@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icon_star_colored@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_colored.imageset/icon_star_colored@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon_star_gray.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "icon_star_gray@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "icon_star_gray@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/icon_star_gray.imageset/icon_star_gray@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_call_detail_1.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_call_detail_1@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_call_detail_1@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_call_detail_1.imageset/tag_call_detail_1@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_canceled_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_canceled_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_canceled_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_canceled_ios.imageset/tag_canceled_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_completed_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_completed_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_completed_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_completed_ios.imageset/tag_completed_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_location_detail_1.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_location_detail_1@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_location_detail_1@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_location_detail_1.imageset/tag_location_detail_1@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_noshow_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_noshow_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_noshow_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_noshow_ios.imageset/tag_noshow_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_planned_ios.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_planned_ios@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_planned_ios@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_planned_ios.imageset/tag_planned_ios@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tag_store_detail_1.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tag_store_detail_1@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tag_store_detail_1@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tag_store_detail_1.imageset/tag_store_detail_1@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "tdesign_pen-ball.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "tdesign_pen-ball@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "tdesign_pen-ball@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball@2x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Assets.xcassets/tdesign_pen-ball.imageset/tdesign_pen-ball@3x.png
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Font/Pretendard-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Font/Pretendard-Regular.otf
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Resources/Font/Pretendard-SemiBold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DOSOPT-CDS-TABLING/Tabling-iOS/fb3eab9e14611d3f736fcb597c2455818f6d0e6d/Tabling-iOS/Tabling-iOS/Global/Resources/Font/Pretendard-SemiBold.otf
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Global/Supporting Files/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSAppTransportSecurity
6 |
7 | NSAllowsArbitraryLoads
8 |
9 |
10 | BASE_URL
11 | $(BASE_URL)
12 | UIAppFonts
13 |
14 | Pretendard-Regular.otf
15 | Pretendard-SemiBold.otf
16 |
17 | UIApplicationSceneManifest
18 |
19 | UIApplicationSupportsMultipleScenes
20 |
21 | UISceneConfigurations
22 |
23 | UIWindowSceneSessionRoleApplication
24 |
25 |
26 | UISceneConfigurationName
27 | Default Configuration
28 | UISceneDelegateClassName
29 | $(PRODUCT_MODULE_NAME).SceneDelegate
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Base/BaseService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BaseService.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | class BaseService {
13 | func judgeStatus(by statusCode: Int, _ data: Data, _ t: T.Type) -> NetworkResult {
14 | let decoder = JSONDecoder()
15 | guard let decodedData = try? decoder.decode(GenericResponse.self, from: data) else { return .pathErr }
16 | switch statusCode {
17 | case 200..<300: return .success(decodedData as Any)
18 | case 400..<500: return .requestErr(decodedData as Any)
19 | case 500: return .serverErr
20 | default: return .networkFail
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Base/GenericResponse.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GenericResponse.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | struct GenericResponse: Codable {
11 |
12 | var code: Int
13 | var message: String
14 | var data: T?
15 |
16 | enum CodingKeys: CodingKey {
17 | case code
18 | case message
19 | case data
20 | }
21 |
22 | init(from decoder: Decoder) throws {
23 | let values = try decoder.container(keyedBy: CodingKeys.self)
24 | code = (try? values.decode(Int.self, forKey: .code)) ?? -1
25 | message = (try? values.decode(String.self, forKey: .message)) ?? ""
26 | data = (try? values.decode(T.self, forKey: .data)) ?? nil
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Base/NetworkConstant.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NetworkConstant.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | enum NetworkConstant {
13 | static var header: HTTPHeaders = ["Content-Type": "application/json"]
14 | }
15 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Base/NetworkResult.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NetworkResult.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | enum NetworkResult {
11 | case success(T)
12 | case requestErr(T)
13 | case pathErr
14 | case serverErr
15 | case networkFail
16 | }
17 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Base/URLConstant.swift:
--------------------------------------------------------------------------------
1 | //
2 | // URLConstant.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | enum URLConstant {
11 |
12 | // MARK: - Base URL
13 |
14 | static let baseURL = Config.baseURL
15 |
16 | // MARK: - WaitingDetail
17 |
18 | static let waitingDetailURL = baseURL + "/orders"
19 |
20 | // MARK: - StoreDetail
21 |
22 | static let storeDetailURL = baseURL + "/shops"
23 | static let waitingStartURL = baseURL + "/orders/reserve"
24 |
25 | // MARK: - StoreList
26 | static let storeListURL = baseURL + "/shops"
27 |
28 | // MARK: - TablingList
29 |
30 | static let tablingURL = baseURL + "/orders"
31 | static let completeURL = baseURL + "/orders/complete"
32 | }
33 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/StoreDetail/ReserveEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReserveEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct ReserveEntity: Codable {
11 | let orderID, waitingNumber, beforeCount: Int
12 | let shopName: String
13 | let personCount: Int
14 | let orderStatus: String
15 |
16 | enum CodingKeys: String, CodingKey {
17 | case orderID = "order_id"
18 | case waitingNumber = "waiting_number"
19 | case beforeCount = "before_count"
20 | case shopName = "shop_name"
21 | case personCount = "person_count"
22 | case orderStatus = "order_status"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/StoreDetail/StoreDetailEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreDetailEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import Foundation
9 |
10 | struct StoreDetailEntity: Codable {
11 | let shopID: Int
12 | let detailPhotoList: [String]
13 | let currentWaiting: Int
14 | let name, longAddress, salesTime, waitingTime: String
15 | let restTime, restDay, phoneNumber: String
16 | let hashTagList: [String]
17 | let introduceContent: String
18 | let menuList: [MenuList]
19 | let averageStar, reviewCount: Int
20 | let detailStarList: [Double]
21 | let reviewList: [ReviewList]
22 |
23 | enum CodingKeys: String, CodingKey {
24 | case shopID = "shop_id"
25 | case detailPhotoList = "detail_photo_list"
26 | case currentWaiting = "current_waiting"
27 | case name
28 | case longAddress = "long_address"
29 | case salesTime = "sales_time"
30 | case waitingTime = "waiting_time"
31 | case restTime = "rest_time"
32 | case restDay = "rest_day"
33 | case phoneNumber = "phone_number"
34 | case hashTagList = "hash_tag_list"
35 | case introduceContent = "introduce_content"
36 | case menuList = "menu_list"
37 | case averageStar = "average_star"
38 | case reviewCount = "review_count"
39 | case detailStarList = "detail_star_list"
40 | case reviewList = "review_list"
41 | }
42 | }
43 |
44 | // MARK: - MenuList
45 | struct MenuList: Codable {
46 | let menuCategory: String
47 | let menuInfoList: [MenuInfoList]
48 |
49 | enum CodingKeys: String, CodingKey {
50 | case menuCategory = "menu_category"
51 | case menuInfoList = "menu_info_list"
52 | }
53 | }
54 |
55 | // MARK: - MenuInfoList
56 | struct MenuInfoList: Codable {
57 | let menuID: Int
58 | let menuPhotoURL: String
59 | let menuName: String
60 | let price: Int
61 |
62 | enum CodingKeys: String, CodingKey {
63 | case menuID = "menu_id"
64 | case menuPhotoURL = "menu_photo_url"
65 | case menuName = "menu_name"
66 | case price
67 | }
68 | }
69 |
70 | // MARK: - ReviewList
71 | struct ReviewList: Codable {
72 | let reviewID, star: Int
73 | let reviewerName: String
74 | let dayBefore: Int
75 | let reviewContent: String
76 |
77 | enum CodingKeys: String, CodingKey {
78 | case reviewID = "review_id"
79 | case star
80 | case reviewerName = "reviewer_name"
81 | case dayBefore = "day_before"
82 | case reviewContent = "review_content"
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/StoreList/LocationData.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LocationEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/25/23.
6 | //
7 |
8 | import Foundation
9 |
10 | struct LocationData {
11 | let location: String
12 | }
13 |
14 | var LocationDummyData: [LocationData] = [.init(location: "전체"),
15 | .init(location: "강서/마곡"),
16 | .init(location: "압구정/청담"),
17 | .init(location: "강남역/역삼"),
18 | .init(location: "논현"),
19 | .init(location: "선릉/삼성"),
20 | .init(location: "양재/수서/도곡"),
21 | .init(location: "서초/방배"),
22 | .init(location: "잠실/방이"),
23 | .init(location: "가로수길"),
24 | .init(location: "사당/이수"),
25 | .init(location: "송리단길"),
26 | .init(location: "여의도"),
27 | .init(location: "문래/영등포"),
28 | .init(location: "구로/신도림"),
29 | .init(location: "목동/양천"),
30 | .init(location: "서울대/신림"),
31 | .init(location: "노량진/동작"),
32 | .init(location: "강동/천호"),
33 | .init(location: "문정/가락")
34 |
35 | ]
36 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/StoreList/StoreListEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import Foundation
9 |
10 | struct StoreListEntity: Codable {
11 | let shopID, reviewCount, averageWaiting, currentWaiting: Int
12 | let averageStar: Double
13 | let name, shopCategory, shortAddress, profileImage: String
14 |
15 | enum CodingKeys: String, CodingKey {
16 | case shopID = "shop_id"
17 | case averageStar = "average_star"
18 | case reviewCount = "review_count"
19 | case averageWaiting = "average_waiting"
20 | case currentWaiting = "current_waiting"
21 | case name = "name"
22 | case shopCategory = "shop_category"
23 | case shortAddress = "short_address"
24 | case profileImage = "profile_photo_url"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/TablingList/CompleteEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CompleteEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/28.
6 | //
7 |
8 | import Foundation
9 |
10 | struct CompleteEntity: Codable {
11 | let orderID, waitingNumber, beforeCount: Int
12 | let shopName: String
13 | let personCount: Int
14 | let orderStatus: String
15 |
16 | enum CodingKeys: String, CodingKey {
17 | case orderID = "order_id"
18 | case waitingNumber = "waiting_number"
19 | case beforeCount = "before_count"
20 | case shopName = "shop_name"
21 | case personCount = "person_count"
22 | case orderStatus = "order_status"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/TablingList/TablingListEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TablingListEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/22.
6 | //
7 |
8 | import Foundation
9 |
10 | struct TablingListEntity: Codable {
11 | let orderID: Int
12 | let orderStatus: String
13 | let shopID: Int
14 | let shopName, orderDate: String
15 | let personCount, waitingNumber, beforeCount, remainingReviewPeriod: Int
16 |
17 | enum CodingKeys: String, CodingKey {
18 | case orderID = "order_id"
19 | case orderStatus = "order_status"
20 | case shopID = "shop_id"
21 | case shopName = "shop_name"
22 | case orderDate = "order_date"
23 | case personCount = "person_count"
24 | case waitingNumber = "waiting_number"
25 | case beforeCount = "before_count"
26 | case remainingReviewPeriod = "remaining_review_period"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Entity/WaitingDetail/WaitingDetailEntity.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WaitingDetailEntity.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import Foundation
9 |
10 | struct WaitingDetailEntity: Codable {
11 | let orderID: Int
12 | let shopName: String
13 | let waitingNumber, beforeCount: Int
14 | let orderDate: String
15 | let personCount: Int
16 | let orderStatus: String
17 | let totalPrice: Int
18 | let requestContent: String
19 |
20 | enum CodingKeys: String, CodingKey {
21 | case orderID = "order_id"
22 | case shopName = "shop_name"
23 | case waitingNumber = "waiting_number"
24 | case beforeCount = "before_count"
25 | case orderDate = "order_date"
26 | case personCount = "person_count"
27 | case orderStatus = "order_status"
28 | case totalPrice = "total_price"
29 | case requestContent = "request_content"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Enviornment/Config.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Config.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | enum Config {
11 |
12 | enum Keys {
13 | enum Plist {
14 | static let baseURL = "BASE_URL"
15 | }
16 | }
17 |
18 | private static let infoDictionary: [String: Any] = {
19 | guard let dict = Bundle.main.infoDictionary else {
20 | fatalError("plist cannot found.")
21 | }
22 | return dict
23 | }()
24 | }
25 |
26 | extension Config {
27 |
28 | // MARK: Base URL
29 |
30 | static let baseURL: String = {
31 | guard let url = Config.infoDictionary[Keys.Plist.baseURL] as? String else {
32 | fatalError("Base URL is not set in plist for this configuration.")
33 | }
34 | return url
35 | }()
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Services/StoreDetailService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreDetailService.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | final class StoreDetailService: BaseService {
13 |
14 | static let shared = StoreDetailService()
15 |
16 | private override init() {}
17 | }
18 |
19 | extension StoreDetailService {
20 | func getStoreDetailAPI(shopId: Int, completion: @escaping (NetworkResult) -> Void) {
21 | let url = URLConstant.storeDetailURL
22 | let header: HTTPHeaders = NetworkConstant.header
23 | let dataRequest = AF.request(url+"/\(shopId)",
24 | method: .get,
25 | encoding: JSONEncoding.default,
26 | headers: header)
27 |
28 | dataRequest.responseData { response in
29 | switch response.result {
30 | case .success:
31 | guard let statusCode = response.response?.statusCode else { return }
32 | guard let data = response.data else { return }
33 | let networkResult = self.judgeStatus(by: statusCode,
34 | data,
35 | StoreDetailEntity.self)
36 | completion(networkResult)
37 | case .failure:
38 | completion(.networkFail)
39 | }
40 | }
41 | }
42 |
43 | func postTablingStartAPI(
44 | shopId: Int,
45 | personCount: Int,
46 | completion: @escaping (NetworkResult) -> Void) {
47 | let url = URLConstant.waitingStartURL
48 | let header: HTTPHeaders = NetworkConstant.header
49 | let body = [
50 | "shop_id": shopId,
51 | "person_count": personCount
52 | ]
53 | let dataRequest = AF.request(url,
54 | method: .post,
55 | parameters: body,
56 | encoding: JSONEncoding.default,
57 | headers: header)
58 |
59 | dataRequest.responseData { response in
60 | switch response.result {
61 | case .success:
62 | guard let statusCode = response.response?.statusCode else { return }
63 | guard let data = response.data else { return }
64 | let networkResult = self.judgeStatus(by: statusCode,
65 | data,
66 | ReserveEntity.self)
67 | completion(networkResult)
68 | case .failure:
69 | completion(.networkFail)
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Services/StoreListService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListService.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | final class StoreListService: BaseService {
13 |
14 | static let shared = StoreListService()
15 |
16 | private override init() {}
17 | }
18 |
19 | extension StoreListService {
20 | func getStoreListAPI(completion: @escaping (NetworkResult) -> Void) {
21 | let url = URLConstant.storeListURL
22 | let header: HTTPHeaders = NetworkConstant.header
23 | let dataRequest = AF.request(url,
24 | method: .get,
25 | encoding: JSONEncoding.default,
26 | headers: header)
27 |
28 | dataRequest.responseData { response in
29 | switch response.result {
30 | case .success:
31 | guard let statusCode = response.response?.statusCode else { return }
32 | guard let data = response.data else { return }
33 | let networkResult = self.judgeStatus(by: statusCode,
34 | data,
35 | [StoreListEntity].self)
36 | completion(networkResult)
37 | case .failure:
38 | completion(.networkFail)
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Services/TablingListService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TablingListService.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | final class TablingListService: BaseService {
13 |
14 | static let shared = TablingListService()
15 |
16 | private override init() {}
17 | }
18 |
19 | extension TablingListService {
20 | func getTablingListAPI(completion: @escaping (NetworkResult) -> Void) {
21 | let url = URLConstant.tablingURL
22 | let header: HTTPHeaders = NetworkConstant.header
23 | let dataRequest = AF.request(url,
24 | method: .get,
25 | encoding: JSONEncoding.default,
26 | headers: header)
27 |
28 | dataRequest.responseData { response in
29 | switch response.result {
30 | case .success:
31 | guard let statusCode = response.response?.statusCode else { return }
32 | guard let data = response.data else { return }
33 | let networkResult = self.judgeStatus(by: statusCode,
34 | data,
35 | [TablingListEntity].self)
36 | completion(networkResult)
37 | case .failure:
38 | completion(.networkFail)
39 | }
40 | }
41 | }
42 |
43 | func patchCompleteAPI(
44 | id: Int,
45 | completion: @escaping (NetworkResult) -> Void) {
46 | let url = URLConstant.completeURL
47 | let header: HTTPHeaders = NetworkConstant.header
48 | let body: Parameters = [
49 | "order_id": id
50 | ]
51 | let dataRequest = AF.request(url,
52 | method: .patch,
53 | parameters: body,
54 | encoding: JSONEncoding.default,
55 | headers: header)
56 |
57 | dataRequest.responseData { response in
58 | switch response.result {
59 | case .success:
60 | guard let statusCode = response.response?.statusCode else { return }
61 | guard let data = response.data else { return }
62 | let networkResult = self.judgeStatus(by: statusCode,
63 | data,
64 | CompleteEntity.self)
65 | completion(networkResult)
66 | case .failure:
67 | completion(.networkFail)
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Network/Services/WaitingDetailService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WaitingDetailService.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/25.
6 | //
7 |
8 | import Foundation
9 |
10 | import Alamofire
11 |
12 | final class WaitingDetailService: BaseService {
13 |
14 | static let shared = WaitingDetailService()
15 |
16 | private override init() {}
17 | }
18 |
19 | extension WaitingDetailService {
20 | func getWaitingDetailAPI(
21 | orderID: Int,
22 | completion: @escaping (NetworkResult) -> Void) {
23 | let url = URLConstant.waitingDetailURL + "/\(orderID)"
24 | let header: HTTPHeaders = NetworkConstant.header
25 | let dataRequest = AF.request(url,
26 | method: .get,
27 | encoding: JSONEncoding.default,
28 | headers: header)
29 |
30 | dataRequest.responseData { response in
31 | switch response.result {
32 | case .success:
33 | guard let statusCode = response.response?.statusCode else { return }
34 | guard let data = response.data else { return }
35 | let networkResult = self.judgeStatus(by: statusCode,
36 | data,
37 | WaitingDetailEntity.self)
38 | completion(networkResult)
39 | case .failure:
40 | completion(.networkFail)
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/ReserveAlert/ViewController/ReserveAlertViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReserveAlertViewController.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/21.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class ReserveAlertViewController: UIViewController {
13 |
14 | // MARK: - Properties
15 |
16 | var reserveEntity: ReserveEntity?
17 | var shopId: Int = 0
18 | var personCount: Int = 0
19 |
20 | // MARK: - UI Components
21 |
22 | private let reserveAlertView = ReserveAlertView()
23 |
24 | // MARK: - Life Cycles
25 |
26 | override func viewDidLoad() {
27 | super.viewDidLoad()
28 |
29 | postReserveAPI()
30 | setUI()
31 | setHierachy()
32 | setLayout()
33 | setDelegate()
34 | }
35 | }
36 |
37 | // MARK: - Extensions
38 | extension ReserveAlertViewController {
39 | func setUI() {
40 | view.backgroundColor = .black.withAlphaComponent(0.5)
41 | }
42 |
43 | func setHierachy() {
44 | view.addSubview(reserveAlertView)
45 | }
46 |
47 | func setDelegate() {
48 | reserveAlertView.buttonDelegate = self
49 | }
50 |
51 | func setLayout() {
52 | reserveAlertView.snp.makeConstraints {
53 | $0.center.equalToSuperview()
54 | $0.width.equalTo(320)
55 | $0.height.equalTo(415)
56 | }
57 | }
58 |
59 | func fetchData() {
60 | guard let postResponse = reserveEntity else { return }
61 | reserveAlertView.setDataBind(model: postResponse)
62 | }
63 | }
64 |
65 | extension ReserveAlertViewController: ButtonDelegate {
66 | func closeButtonTapped() {
67 | self.dismiss(animated: false)
68 | }
69 |
70 | func detailButtonTappd() {
71 | guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
72 | let keyWindow = windowScene.windows.first else {
73 | return
74 | }
75 | let rootVC = UINavigationController(rootViewController: TablingListViewController())
76 | keyWindow.rootViewController = rootVC
77 | }
78 | }
79 |
80 | extension ReserveAlertViewController {
81 | func postReserveAPI() {
82 | StoreDetailService.shared.postTablingStartAPI(
83 | shopId: self.shopId,
84 | personCount: self.personCount) { networkResult in
85 | switch networkResult {
86 | case .success(let data):
87 | if let data = data as? GenericResponse {
88 | if let listData = data.data {
89 | self.reserveEntity = listData
90 | }
91 | DispatchQueue.main.async {
92 | self.fetchData()
93 | }
94 | }
95 | case .requestErr, .serverErr:
96 | print("오류발생")
97 | default:
98 | break
99 |
100 | }
101 | }
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/ReserveBottomSheet/View/ReserveBottomSheetView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReserveBottomSheetView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/22/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | protocol ReserveBottomSheetButtonDelegate: AnyObject {
13 | func bottomSheetCloseButtonTapped()
14 | func bottomSheetTablingButtonTapped(person: Int)
15 | }
16 |
17 | final class ReserveBottomSheetView: UIView {
18 |
19 | // MARK: - Properties
20 |
21 | weak var reserveBottomSheetButtonDelegate: ReserveBottomSheetButtonDelegate?
22 |
23 | private var personCount: Int = 1 {
24 | didSet {
25 | personCountLabel.text = personCount.description
26 | }
27 | }
28 |
29 | // MARK: - UI Components
30 |
31 | private let dismissButton: UIButton = {
32 | let button = UIButton()
33 | button.setImage(ImageLiterals.StoreDetail.ic_exit_circle, for: .normal)
34 | return button
35 | }()
36 |
37 | private let personChoiceLabel: UILabel = {
38 | let label = UILabel()
39 | label.text = I18N.ReserveBottomSheet.personChoiceTitle
40 | label.textColor = .Gray800
41 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 20))
42 | label.partColorChange(targetString: "방문 인원", textColor: .TablingSecondary1)
43 | return label
44 | }()
45 |
46 | private let personLabel: UILabel = {
47 | let label = UILabel()
48 | label.text = I18N.ReserveBottomSheet.personTitle
49 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
50 | return label
51 | }()
52 |
53 | private lazy var choicePersonStackView: UIStackView = {
54 | let stackView = UIStackView()
55 | stackView.addArrangedSubviews(minusButton, personCountLabel, plusButton)
56 | stackView.distribution = .fillEqually
57 | return stackView
58 | }()
59 |
60 | private lazy var choicePersonView: UIView = {
61 | let view = UIView()
62 | view.backgroundColor = .clear
63 | view.layer.borderWidth = 1
64 | view.layer.borderColor = UIColor.Gray100.cgColor
65 | view.layer.cornerRadius = 20
66 | return view
67 | }()
68 |
69 | private let minusButton: UIButton = {
70 | let button = UIButton(type: .custom)
71 | button.isEnabled = false
72 | button.setImage(ImageLiterals.StoreDetail.ic_minus_able, for: .normal)
73 | button.setImage(ImageLiterals.StoreDetail.ic_minus_disable, for: .disabled)
74 | return button
75 | }()
76 |
77 | private let plusButton: UIButton = {
78 | let button = UIButton()
79 | button.setImage(ImageLiterals.StoreDetail.ic_plus, for: .normal)
80 | return button
81 | }()
82 |
83 | private lazy var personCountLabel: UILabel = {
84 | let label = UILabel()
85 | label.text = personCount.description
86 | label.textAlignment = .center
87 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
88 | return label
89 | }()
90 |
91 | private let tablingButton: UIButton = {
92 | let button = UIButton()
93 | button.setTitle(I18N.ReserveBottomSheet.tablingButtonTitle, for: .normal)
94 | button.setTitleColor(.TablingWhite, for: .normal)
95 | button.titleLabel?.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
96 | button.layer.cornerRadius = 8
97 | button.backgroundColor = .TablingPrimary
98 | return button
99 | }()
100 |
101 | // MARK: - Life Cycles
102 |
103 | override init(frame: CGRect) {
104 | super.init(frame: frame)
105 |
106 | setUI()
107 | setHierarchy()
108 | setLayout()
109 | setAddTarget()
110 | }
111 |
112 | @available(*, unavailable)
113 | required init?(coder: NSCoder) {
114 | fatalError("init(coder:) has not been implemented")
115 | }
116 | }
117 |
118 | // MARK: - Extensions
119 | extension ReserveBottomSheetView {
120 | func setUI() {
121 | self.backgroundColor = .TablingWhite
122 | }
123 |
124 | func setHierarchy() {
125 | addSubviews(dismissButton, personChoiceLabel, personLabel, choicePersonView, tablingButton)
126 | choicePersonView.addSubviews(minusButton, personCountLabel, plusButton)
127 | }
128 |
129 | func setLayout() {
130 | dismissButton.snp.makeConstraints {
131 | $0.top.equalToSuperview().inset(19)
132 | $0.trailing.equalToSuperview().inset(16)
133 | $0.size.equalTo(24)
134 | }
135 |
136 | personChoiceLabel.snp.makeConstraints {
137 | $0.top.equalToSuperview().inset(45)
138 | $0.leading.equalToSuperview().inset(14)
139 | }
140 |
141 | personLabel.snp.makeConstraints {
142 | $0.top.equalTo(personChoiceLabel.snp.bottom).offset(28)
143 | $0.leading.equalToSuperview().inset(16)
144 | }
145 |
146 | choicePersonView.snp.makeConstraints {
147 | $0.centerY.equalTo(personLabel.snp.centerY)
148 | $0.trailing.equalToSuperview().inset(16)
149 | $0.width.equalTo(102)
150 | $0.height.equalTo(38)
151 | }
152 |
153 | minusButton.snp.makeConstraints {
154 | $0.centerY.equalToSuperview()
155 | $0.leading.equalToSuperview().inset(10)
156 | $0.width.equalTo(18)
157 | $0.height.equalTo(18)
158 | }
159 |
160 | personCountLabel.snp.makeConstraints {
161 | $0.centerY.equalToSuperview()
162 | $0.centerX.equalToSuperview()
163 | }
164 |
165 | plusButton.snp.makeConstraints {
166 | $0.centerY.equalToSuperview()
167 | $0.trailing.equalToSuperview().inset(10)
168 | $0.width.equalTo(18)
169 | $0.height.equalTo(18)
170 | }
171 |
172 | tablingButton.snp.makeConstraints {
173 | $0.leading.trailing.equalToSuperview().inset(16)
174 | $0.bottom.equalToSuperview().inset(38)
175 | $0.height.equalTo(56)
176 | }
177 | }
178 |
179 | func setAddTarget() {
180 | dismissButton.addTarget(self, action: #selector(closeButtonClicked), for: .touchUpInside)
181 | tablingButton.addTarget(self, action: #selector(tablingButtonClicked), for: .touchUpInside)
182 | minusButton.addTarget(self, action: #selector(minusButtonClicked), for: .touchUpInside)
183 | plusButton.addTarget(self, action: #selector(plusButtonClicked), for: .touchUpInside)
184 | }
185 |
186 | @objc
187 | func closeButtonClicked(_ sender: UIButton) {
188 | reserveBottomSheetButtonDelegate?.bottomSheetCloseButtonTapped()
189 | }
190 |
191 | @objc
192 | func tablingButtonClicked(_ sender: UIButton) {
193 | reserveBottomSheetButtonDelegate?.bottomSheetTablingButtonTapped(person: personCount)
194 | }
195 |
196 | @objc
197 | func minusButtonClicked(_ sender: UIButton) {
198 | if personCount >= 2 { personCount -= 1 }
199 | if personCount == 1 { minusButton.isEnabled = false }
200 | }
201 |
202 | @objc
203 | func plusButtonClicked(_ sender: UIButton) {
204 | if personCount <= 99 { personCount += 1 }
205 | if personCount >= 2 { minusButton.isEnabled = true }
206 | }
207 | }
208 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/ReserveBottomSheet/ViewController/ReserveBottomSheetViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReserveBottomSheetViewController.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/22/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class ReserveBottomSheetViewController: UIViewController {
11 |
12 | // MARK: - Properties
13 |
14 | var shopId: Int = 0
15 |
16 | // MARK: - UI Components
17 |
18 | private let dimmedBackView: UIView = {
19 | let view = UIView()
20 | view.backgroundColor = .black.withAlphaComponent(0.5)
21 | return view
22 | }()
23 |
24 | private let reserveBottomSheetView: ReserveBottomSheetView = {
25 | let view = ReserveBottomSheetView()
26 | view.clipsToBounds = true
27 | view.layer.cornerRadius = 16
28 | view.layer.maskedCorners = CACornerMask(arrayLiteral: .layerMinXMinYCorner, .layerMaxXMinYCorner)
29 | return view
30 | }()
31 |
32 | // MARK: - Life Cycles
33 |
34 | override func viewDidLoad() {
35 | super.viewDidLoad()
36 |
37 | setHierarchy()
38 | setLayout()
39 | setDelegate()
40 | setupGestureRecognizer()
41 | }
42 | }
43 |
44 | // MARK: - Extensions
45 | extension ReserveBottomSheetViewController {
46 |
47 | func setHierarchy() {
48 | view.addSubviews(dimmedBackView, reserveBottomSheetView)
49 | }
50 |
51 | func setLayout() {
52 | dimmedBackView.snp.makeConstraints {
53 | $0.edges.equalToSuperview()
54 | }
55 |
56 | reserveBottomSheetView.snp.makeConstraints {
57 | $0.leading.trailing.bottom.equalToSuperview()
58 | $0.height.equalTo(248)
59 | }
60 | }
61 |
62 | func setDelegate() {
63 | reserveBottomSheetView.reserveBottomSheetButtonDelegate = self
64 | }
65 |
66 | func hideBottomSheet() {
67 | UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseIn,
68 | animations: {
69 | self.dimmedBackView.alpha = 0.0
70 | self.view.layoutIfNeeded()
71 | },
72 | completion: { _ in
73 | if self.presentingViewController != nil {
74 | self.dismiss(animated: true)
75 | }
76 | })
77 | }
78 |
79 | func setupGestureRecognizer() {
80 | let dimmedTap = UITapGestureRecognizer(target: self, action: #selector(dimmedViewTapped(_:)))
81 | dimmedBackView.addGestureRecognizer(dimmedTap)
82 | dimmedBackView.isUserInteractionEnabled = true
83 | }
84 |
85 | @objc
86 | private func dimmedViewTapped(_ tapRecognizer: UITapGestureRecognizer) {
87 | hideBottomSheet()
88 | }
89 | }
90 |
91 | extension ReserveBottomSheetViewController: ReserveBottomSheetButtonDelegate {
92 | func bottomSheetCloseButtonTapped() {
93 | hideBottomSheet()
94 | }
95 |
96 | func bottomSheetTablingButtonTapped(person: Int) {
97 | guard let pvc = self.presentingViewController else { return }
98 | self.dismiss(animated: false) {
99 | let alertVC = ReserveAlertViewController()
100 | alertVC.modalPresentationStyle = .overFullScreen
101 | alertVC.shopId = self.shopId
102 | alertVC.personCount = person
103 | pvc.present(alertVC, animated: false)
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/DetailStarTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailStarTableViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/24.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class DetailStarTableViewCell: UITableViewCell, UITableViewRegisterable {
13 |
14 | // MARK: - UI Components
15 |
16 | private let detailTitle: UILabel = {
17 | let label = UILabel()
18 | label.text = I18N.StoreDetail.testLabel
19 | label.textColor = .Gray800
20 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
21 | return label
22 | }()
23 |
24 | private lazy var progressView: UIProgressView = {
25 | lazy var progressView = UIProgressView()
26 | progressView.progressViewStyle = .default
27 | progressView.progressTintColor = .Gray400
28 | progressView.trackTintColor = .Gray000
29 | progressView.clipsToBounds = true
30 | progressView.layer.cornerRadius = 3
31 | return progressView
32 | }()
33 |
34 | private let detailStar: UILabel = {
35 | let label = UILabel()
36 | label.text = I18N.StoreDetail.testLabel
37 | label.textColor = .Gray800
38 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 11))
39 | return label
40 | }()
41 |
42 | // MARK: - Life Cycles
43 |
44 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
45 | super.init(style: style, reuseIdentifier: reuseIdentifier)
46 |
47 | setHierarchy()
48 | setLayout()
49 | }
50 |
51 | @available(*, unavailable)
52 | required init?(coder: NSCoder) {
53 | fatalError("init(coder:) has not been implemented")
54 | }
55 | }
56 |
57 | // MARK: - Extensions
58 | extension DetailStarTableViewCell {
59 | func setUI() {
60 | backgroundColor = .TablingWhite
61 | }
62 |
63 | func setHierarchy() {
64 | addSubviews(detailTitle, detailStar, progressView)
65 | }
66 |
67 | func setLayout() {
68 | detailTitle.snp.makeConstraints {
69 | $0.top.leading.bottom.equalToSuperview()
70 | }
71 |
72 | detailStar.snp.makeConstraints {
73 | $0.top.trailing.bottom.equalToSuperview()
74 | $0.width.equalTo(26)
75 | }
76 |
77 | progressView.snp.makeConstraints {
78 | $0.top.equalToSuperview().inset(5)
79 | $0.trailing.equalTo(detailStar.snp.leading).offset(-6)
80 | $0.width.equalTo(99)
81 | $0.height.equalTo(7)
82 | }
83 | }
84 |
85 | func setDataBind(model: StoreDetailEntity) {
86 | switch tag {
87 | case 0: detailTitle.text = I18N.StoreDetail.detailTitle1
88 | case 1: detailTitle.text = I18N.StoreDetail.detailTitle2
89 | case 2: detailTitle.text = I18N.StoreDetail.detailTitle3
90 | case 3: detailTitle.text = I18N.StoreDetail.detailTitle4
91 | default: break
92 | }
93 | progressView.progress = Float(model.detailStarList[tag] * 0.2)
94 | detailStar.text = "\(model.detailStarList[tag])점"
95 | detailStar.textAlignment = .right
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/LeftAlignedCollectionViewFlowLayout.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LeftAlignedCollectionViewFlowLayout.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/29/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class LeftAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
11 | override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
12 | let attributes = super.layoutAttributesForElements(in: rect)
13 |
14 | var leftMargin = sectionInset.left
15 | var maxY: CGFloat = -1.0
16 | attributes?.forEach { layoutAttribute in
17 | if layoutAttribute.representedElementKind == nil {
18 | if layoutAttribute.frame.origin.y >= maxY {
19 | leftMargin = sectionInset.left
20 | }
21 |
22 | layoutAttribute.frame.origin.x = leftMargin
23 |
24 | leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
25 | maxY = max(layoutAttribute.frame.maxY, maxY)
26 | }
27 | }
28 | return attributes
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/MenuCollectionHeaderView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MenuCollectionHeaderView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/23/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class MenuCollectionHeaderView: UICollectionReusableView {
11 |
12 | // MARK: - UI Components
13 |
14 | private let headerLabel: UILabel = {
15 | let label = UILabel()
16 | label.text = I18N.StoreList.storeTestLabel
17 | label.textColor = .Gray800
18 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
19 | return label
20 | }()
21 |
22 | // MARK: - Life Cycles
23 |
24 | override init(frame: CGRect) {
25 | super.init(frame: frame)
26 |
27 | setUI()
28 | setHierarchy()
29 | setLayout()
30 | }
31 |
32 | @available(*, unavailable)
33 | required init?(coder: NSCoder) {
34 | fatalError("init(coder:) has not been implemented")
35 | }
36 | }
37 |
38 | // MARK: - Extensions
39 | extension MenuCollectionHeaderView {
40 | func setUI() {
41 | self.backgroundColor = .TablingWhite
42 | }
43 |
44 | func setHierarchy() {
45 | self.addSubviews(headerLabel)
46 | }
47 |
48 | func setLayout() {
49 | headerLabel.snp.makeConstraints {
50 | $0.top.equalToSuperview()
51 | $0.bottom.equalToSuperview().inset(6)
52 | $0.leading.equalTo(15)
53 | }
54 | }
55 |
56 | func setDataBind(data: String) {
57 | headerLabel.text = data
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/MenuCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MenuCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/23/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class MenuCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
11 |
12 | // MARK: - UI Components
13 |
14 | private let menuImage: UIImageView = {
15 | let imageView = UIImageView()
16 | imageView.contentMode = .scaleAspectFill
17 | imageView.layer.cornerRadius = 6
18 | return imageView
19 | }()
20 |
21 | private let menuLabel: UILabel = {
22 | let label = UILabel()
23 | label.text = I18N.StoreList.storeTestLabel
24 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 14))
25 | label.textColor = .Gray800
26 | return label
27 | }()
28 |
29 | private let priceLabel: UILabel = {
30 | let label = UILabel()
31 | label.text = I18N.StoreList.storeTestLabel
32 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 14))
33 | label.textColor = .TablingPrimary
34 | return label
35 | }()
36 |
37 | // MARK: - Life Cycles
38 |
39 | override init(frame: CGRect) {
40 | super.init(frame: frame)
41 |
42 | setUI()
43 | setHierarchy()
44 | setLayout()
45 | }
46 |
47 | required init?(coder: NSCoder) {
48 | fatalError("init(coder:) has not been implemented")
49 | }
50 | }
51 |
52 | // MARK: - Extensions
53 | extension MenuCollectionViewCell {
54 | func setUI() {
55 | self.backgroundColor = .TablingWhite
56 | }
57 |
58 | func setHierarchy() {
59 | self.addSubviews(menuImage, menuLabel, priceLabel)
60 | }
61 |
62 | func setLayout() {
63 |
64 | menuImage.snp.makeConstraints {
65 | $0.top.leading.trailing.equalToSuperview()
66 | $0.height.equalTo(80)
67 | }
68 |
69 | menuLabel.snp.makeConstraints {
70 | $0.leading.trailing.equalToSuperview()
71 | $0.top.equalTo(menuImage.snp.bottom).offset(6)
72 | $0.height.equalTo(21)
73 | }
74 |
75 | priceLabel.snp.makeConstraints {
76 | $0.leading.trailing.equalToSuperview()
77 | $0.top.equalTo(menuLabel.snp.bottom)
78 | }
79 | }
80 |
81 | func setDataBind(model: MenuInfoList) {
82 | menuImage.kfSetImage(url: model.menuPhotoURL)
83 | menuLabel.text = model.menuName
84 |
85 | let numberFormatter: NumberFormatter = NumberFormatter()
86 | numberFormatter.numberStyle = .decimal
87 | let price: String = numberFormatter.string(for: model.price) ?? ""
88 | priceLabel.text = String(price) + "원"
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/RecentReviewTableViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecentReviewTableViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/24.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class RecentReviewTableViewCell: UITableViewCell, UITableViewRegisterable {
13 |
14 | // MARK: - UI Components
15 |
16 | private lazy var starStackView: UIStackView = {
17 | lazy var stackview = UIStackView()
18 | stackview.axis = .horizontal
19 | for _ in 0..<5 {
20 | let starImage = UIImageView()
21 | starImage.image = ImageLiterals.Common.ic_star_empty
22 | starImage.snp.makeConstraints {
23 | $0.size.equalTo(14)
24 | }
25 | stackview.addArrangedSubview(starImage)
26 | }
27 | return stackview
28 | }()
29 |
30 | private let reviewStarLabel: UILabel = {
31 | let label = UILabel()
32 | label.text = I18N.StoreDetail.testLabel
33 | label.textColor = .Gray800
34 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 12))
35 | return label
36 | }()
37 |
38 | private let reviewerName: UILabel = {
39 | let label = UILabel()
40 | label.text = I18N.StoreDetail.testLabel
41 | label.textColor = .Gray200
42 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
43 | return label
44 | }()
45 |
46 | private let dayBefore: UILabel = {
47 | let label = UILabel()
48 | label.text = I18N.StoreDetail.testLabel
49 | label.textColor = .Gray200
50 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
51 | return label
52 | }()
53 |
54 | private let reviewText: UILabel = {
55 | let label = UILabel()
56 | label.text = I18N.StoreDetail.testLabel
57 | label.textColor = .Gray800
58 | label.numberOfLines = 0
59 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 14))
60 | return label
61 | }()
62 |
63 | // MARK: - Life Cycles
64 |
65 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
66 | super.init(style: style, reuseIdentifier: reuseIdentifier)
67 |
68 | setUI()
69 | setHierarchy()
70 | setLayout()
71 | }
72 |
73 | @available(*, unavailable)
74 | required init?(coder: NSCoder) {
75 | fatalError("init(coder:) has not been implemented")
76 | }
77 | }
78 |
79 | // MARK: - Extensions
80 | extension RecentReviewTableViewCell {
81 | func setUI() {
82 | backgroundColor = .TablingWhite
83 | }
84 |
85 | func setHierarchy() {
86 | addSubviews(starStackView, reviewStarLabel, reviewerName, dayBefore, reviewText)
87 | }
88 |
89 | func setLayout() {
90 | starStackView.snp.makeConstraints {
91 | $0.top.equalToSuperview().inset(16)
92 | $0.leading.equalToSuperview()
93 | $0.height.equalTo(14)
94 | }
95 |
96 | reviewStarLabel.snp.makeConstraints {
97 | $0.top.equalTo(starStackView.snp.top)
98 | $0.leading.equalTo(starStackView.snp.trailing).offset(3)
99 | }
100 |
101 | reviewerName.snp.makeConstraints {
102 | $0.top.equalTo(starStackView.snp.bottom).offset(10)
103 | $0.leading.equalToSuperview()
104 | }
105 |
106 | dayBefore.snp.makeConstraints {
107 | $0.top.equalTo(reviewerName.snp.top)
108 | $0.leading.equalTo(reviewerName.snp.trailing).offset(8)
109 | }
110 |
111 | reviewText.snp.makeConstraints {
112 | $0.top.equalTo(reviewerName.snp.bottom).offset(10)
113 | $0.leading.trailing.equalToSuperview()
114 | }
115 | }
116 |
117 | func setDataBind(model: ReviewList) {
118 | reviewStarLabel.text = "\(model.star).0"
119 | reviewerName.text = model.reviewerName
120 | dayBefore.text = "\(model.dayBefore)일 전"
121 | reviewText.text = model.reviewContent
122 |
123 | for (index, starImage) in starStackView.arrangedSubviews.enumerated() {
124 | if let starImage = starImage as? UIImageView {
125 | if index < Int(model.star) {
126 | starImage.image = ImageLiterals.Common.ic_star_fill
127 | } else {
128 | starImage.image = ImageLiterals.Common.ic_star_empty
129 | }
130 | }
131 | }
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/StoreDetailImageCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreDetailImageCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/27/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class StoreDetailImageCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
11 |
12 | // MARK: - UI Components
13 |
14 | private let storeImage: UIImageView = {
15 | let image = UIImageView()
16 | image.contentMode = .scaleAspectFill
17 | return image
18 | }()
19 |
20 | private let gradientView: UIView = {
21 | let view = UIView()
22 | let gradient = CAGradientLayer()
23 | gradient.colors = [UIColor.black.withAlphaComponent(0.0).cgColor,
24 | UIColor.black.withAlphaComponent(0.5).cgColor]
25 | gradient.locations = [0.0, 1.0]
26 | gradient.startPoint = CGPoint(x: 0.5, y: 0.0)
27 | gradient.endPoint = CGPoint(x: 0.5, y: 1.0)
28 | view.layer.addSublayer(gradient)
29 | return view
30 | }()
31 |
32 | // MARK: - Life Cycles
33 | override init(frame: CGRect) {
34 | super.init(frame: frame)
35 |
36 | setHierarchy()
37 | setLayout()
38 | }
39 |
40 | required init?(coder: NSCoder) {
41 | fatalError("init(coder:) has not been implemented")
42 | }
43 |
44 | override func layoutSubviews() {
45 | super.layoutSubviews()
46 |
47 | gradientView.frame = storeImage.bounds
48 | gradientView.layer.sublayers?.first?.frame = gradientView.bounds
49 | }
50 | }
51 |
52 | // MARK: - Extensions
53 | extension StoreDetailImageCollectionViewCell {
54 | func setHierarchy() {
55 | self.addSubview(storeImage)
56 | storeImage.addSubview(gradientView)
57 | }
58 |
59 | func setLayout() {
60 | storeImage.snp.makeConstraints {
61 | $0.edges.equalToSuperview()
62 | }
63 |
64 | gradientView.snp.makeConstraints {
65 | $0.edges.equalToSuperview()
66 | }
67 | }
68 |
69 | func setDataBind(data: String) {
70 | storeImage.kf.setImage(with: URL(string: data))
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/Cell/StoreTagCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreTagCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/29/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class StoreTagCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
13 |
14 | // MARK: - UI Components
15 |
16 | private let tagLabel: UILabel = {
17 | let label = UILabel()
18 | label.text = I18N.StoreDetail.testLabel
19 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 12))
20 | label.textColor = .Gray400
21 | label.textAlignment = .center
22 | return label
23 | }()
24 |
25 | // MARK: - Life Cycles
26 | override init(frame: CGRect) {
27 | super.init(frame: frame)
28 |
29 | setUI()
30 | setHierarchy()
31 | setLayout()
32 | }
33 |
34 | required init?(coder: NSCoder) {
35 | fatalError("init(coder:) has not been implemented")
36 | }
37 | }
38 |
39 | // MARK: - Extensions
40 | extension StoreTagCollectionViewCell {
41 | func setUI() {
42 | tagLabel.layer.cornerRadius = 15
43 | tagLabel.layer.borderWidth = 1
44 | tagLabel.layer.borderColor = UIColor.Gray100.cgColor
45 | }
46 |
47 | func setHierarchy() {
48 | addSubview(tagLabel)
49 | }
50 |
51 | func setLayout() {
52 | tagLabel.snp.makeConstraints {
53 | $0.edges.equalToSuperview()
54 | }
55 | }
56 |
57 | func setDataBind(model: [String], indexPath: IndexPath) {
58 | tagLabel.text = model[indexPath.row]
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/View/AllMenuView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AllMenuView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/21/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class AllMenuView: UIView {
13 |
14 | // MARK: - UI Components
15 |
16 | private let allMenuLabel: UILabel = {
17 | let label = UILabel()
18 | label.text = I18N.StoreDetail.allMenuTitle
19 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
20 | label.textColor = .Gray800
21 | return label
22 | }()
23 |
24 | private let compositionalLayout: UICollectionViewCompositionalLayout = {
25 | // item
26 | let itemSize = NSCollectionLayoutSize(
27 | widthDimension: .fractionalWidth(1.0/3.0),
28 | heightDimension: .fractionalHeight(1.0)
29 | )
30 | let item = NSCollectionLayoutItem(layoutSize: itemSize)
31 | item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 0)
32 |
33 | // group
34 | let groupSize = NSCollectionLayoutSize(
35 | widthDimension: .fractionalWidth(0.9),
36 | heightDimension: .fractionalHeight(0.3)
37 | )
38 | let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
39 |
40 | // header
41 | let headerSize = NSCollectionLayoutSize(
42 | widthDimension: .fractionalWidth(1.0),
43 | heightDimension: .absolute(30)
44 | )
45 | let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
46 |
47 | // section
48 | let section = NSCollectionLayoutSection(group: group)
49 | section.orthogonalScrollingBehavior = .continuous
50 | section.boundarySupplementaryItems = [header]
51 | return UICollectionViewCompositionalLayout(section: section)
52 | }()
53 |
54 | lazy var homeCollectionView: UICollectionView = {
55 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: compositionalLayout)
56 | collectionView.clipsToBounds = true
57 | collectionView.isScrollEnabled = false
58 | return collectionView
59 | }()
60 |
61 | private let allMenuLookImage: UIImageView = {
62 | let imageView = UIImageView()
63 | imageView.image = ImageLiterals.StoreDetail.btn_all_menu_look
64 | return imageView
65 | }()
66 |
67 | // MARK: - Life Cycles
68 |
69 | override init(frame: CGRect) {
70 | super.init(frame: frame)
71 |
72 | setHierarchy()
73 | setLayout()
74 | setRegisterCell()
75 | }
76 |
77 | @available(*, unavailable)
78 | required init?(coder: NSCoder) {
79 | fatalError("init(coder:) has not been implemented")
80 | }
81 | }
82 |
83 | // MARK: - Extensions
84 | extension AllMenuView {
85 |
86 | func setHierarchy() {
87 | self.addSubviews(allMenuLabel, homeCollectionView, allMenuLookImage)
88 | }
89 |
90 | func setLayout() {
91 | allMenuLabel.snp.makeConstraints {
92 | $0.top.equalToSuperview().inset(26)
93 | $0.leading.equalToSuperview().inset(15)
94 | $0.width.equalTo(60)
95 | $0.height.equalTo(24)
96 | }
97 |
98 | homeCollectionView.snp.makeConstraints {
99 | $0.top.equalTo(allMenuLabel.snp.bottom).offset(20)
100 | $0.leading.trailing.equalToSuperview()
101 | }
102 |
103 | allMenuLookImage.snp.makeConstraints {
104 | $0.centerX.equalToSuperview()
105 | $0.top.equalTo(homeCollectionView.snp.bottom).offset(27)
106 | $0.bottom.equalToSuperview().inset(19)
107 | $0.width.equalTo(106)
108 | $0.height.equalTo(35)
109 | }
110 | }
111 |
112 | func setRegisterCell() {
113 | MenuCollectionViewCell.register(collectionView: homeCollectionView)
114 | homeCollectionView.register(MenuCollectionHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "MenuCollectionHeaderView")
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/View/CustomTabBarHeaderView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CustomTabBarHeaderView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 12/4/23.
6 | //
7 |
8 | import UIKit
9 |
10 | protocol CustomTabBarHeaderViewDelegate: AnyObject {
11 | func firstSegmentClicked()
12 | func secondSegmentClicked()
13 | func thirdSegmentClicked()
14 | }
15 |
16 | class CustomTabBarHeaderView: UIView {
17 |
18 | // MARK: - Properties
19 |
20 | weak var customTabBarHeaderViewDelegate: CustomTabBarHeaderViewDelegate?
21 |
22 | // MARK: - UI Components
23 |
24 | private lazy var stackView: UIStackView = {
25 | let stackView = UIStackView()
26 | stackView.addArrangedSubviews(homeButton, allMenuButton, recentReviewButton)
27 | stackView.distribution = .fillEqually
28 | stackView.alignment = .center
29 | return stackView
30 | }()
31 |
32 | private let homeButton: UIButton = {
33 | let button = UIButton()
34 | button.isHighlighted = true
35 | button.setTitle(I18N.StoreDetail.homeSegmentControlTitle, for: .normal)
36 | button.titleLabel?.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
37 | button.setTitleColor(.Gray200, for: .normal)
38 | button.setTitleColor(.Gray800, for: .highlighted)
39 | return button
40 | }()
41 |
42 | private let allMenuButton: UIButton = {
43 | let button = UIButton()
44 | button.setTitle(I18N.StoreDetail.menuSegmentControlTitle, for: .normal)
45 | button.titleLabel?.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
46 | button.setTitleColor(.Gray200, for: .normal)
47 | button.setTitleColor(.Gray800, for: .highlighted)
48 | return button
49 | }()
50 |
51 | private let recentReviewButton: UIButton = {
52 | let button = UIButton()
53 | button.setTitle(I18N.StoreDetail.reviewSegmentControlTitle, for: .normal)
54 | button.titleLabel?.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
55 | button.setTitleColor(.Gray200, for: .normal)
56 | button.setTitleColor(.Gray800, for: .highlighted)
57 | return button
58 | }()
59 |
60 | private let underLineView: UIView = {
61 | let view = UIView()
62 | view.backgroundColor = .Gray600
63 | return view
64 | }()
65 |
66 | // MARK: - Life Cycles
67 |
68 | override init(frame: CGRect) {
69 | super.init(frame: frame)
70 |
71 | setHierarchy()
72 | setLayout()
73 | setAddTarget()
74 | }
75 |
76 | @available(*, unavailable)
77 | required init?(coder: NSCoder) {
78 | fatalError("init(coder:) has not been implemented")
79 | }
80 | }
81 |
82 | // MARK: - Extensions
83 |
84 | extension CustomTabBarHeaderView {
85 |
86 | func setHierarchy() {
87 | self.addSubviews(stackView, underLineView)
88 | }
89 |
90 | func setLayout() {
91 | stackView.snp.makeConstraints {
92 | $0.leading.trailing.equalToSuperview().inset(52)
93 | $0.top.equalToSuperview()
94 | $0.centerX.equalToSuperview()
95 | $0.height.equalTo(34)
96 | }
97 |
98 | underLineView.snp.makeConstraints {
99 | $0.bottom.equalToSuperview()
100 | $0.width.equalTo(92)
101 | $0.height.equalTo(2)
102 | $0.leading.equalTo(stackView.snp.leading).offset(-3)
103 | }
104 | }
105 |
106 | func changeCustomHeader(index: Int) {
107 | changeSegmentedControlLinePosition(selectedSegmentIndex: index)
108 | switch index {
109 | case 0:
110 | homeButton.isHighlighted = true
111 | allMenuButton.isHighlighted = false
112 | recentReviewButton.isHighlighted = false
113 | case 1:
114 | homeButton.isHighlighted = false
115 | allMenuButton.isHighlighted = true
116 | recentReviewButton.isHighlighted = false
117 | default:
118 | homeButton.isHighlighted = false
119 | allMenuButton.isHighlighted = false
120 | recentReviewButton.isHighlighted = true
121 | }
122 | }
123 |
124 | func changeSegmentedControlLinePosition(selectedSegmentIndex: Int) {
125 | let leadingDistance = Int(95 * CGFloat(selectedSegmentIndex) + (95 - self.underLineView.bounds.width) * 0.5)
126 | UIView.animate(withDuration: 0.2, animations: {
127 | self.underLineView.snp.updateConstraints {
128 | $0.leading.equalTo(self.stackView.snp.leading).offset(leadingDistance) }
129 | self.layoutIfNeeded()
130 | })
131 | }
132 |
133 | func setAddTarget() {
134 | homeButton.addTarget(self, action: #selector(isTabButtonClicked), for: .touchUpInside)
135 | allMenuButton.addTarget(self, action: #selector(isTabButtonClicked), for: .touchUpInside)
136 | recentReviewButton.addTarget(self, action: #selector(isTabButtonClicked), for: .touchUpInside)
137 | }
138 |
139 | @objc
140 | private func isTabButtonClicked(_ sender: UIButton) {
141 | switch sender {
142 | case homeButton:
143 | customTabBarHeaderViewDelegate?.firstSegmentClicked()
144 | case allMenuButton:
145 | customTabBarHeaderViewDelegate?.secondSegmentClicked()
146 | case recentReviewButton:
147 | customTabBarHeaderViewDelegate?.thirdSegmentClicked()
148 | default:
149 | break
150 | }
151 | }
152 | }
153 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/View/ImageScrollCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImageScrollCollectionView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/27/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class ImageScrollCollectionView: UIView {
13 |
14 | // MARK: - UI Components
15 |
16 | lazy var imagescrollCollectionView: UICollectionView = {
17 | let flowLayout = UICollectionViewFlowLayout()
18 | flowLayout.minimumInteritemSpacing = 0
19 | flowLayout.minimumLineSpacing = 0
20 | flowLayout.scrollDirection = .horizontal
21 | flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width, height: 300)
22 |
23 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
24 | collectionView.isPagingEnabled = true
25 | collectionView.showsHorizontalScrollIndicator = false
26 | collectionView.backgroundColor = .Gray100
27 | return collectionView
28 | }()
29 |
30 | // MARK: - Life Cycles
31 |
32 | override init(frame: CGRect) {
33 | super.init(frame: frame)
34 |
35 | setHierarchy()
36 | setLayout()
37 | setRegisterCell()
38 | }
39 |
40 | @available(*, unavailable)
41 | required init?(coder: NSCoder) {
42 | fatalError("init(coder:) has not been implemented")
43 | }
44 | }
45 |
46 | // MARK: - Extensions
47 | extension ImageScrollCollectionView {
48 | func setHierarchy() {
49 | self.addSubviews(imagescrollCollectionView)
50 | }
51 |
52 | func setLayout() {
53 | imagescrollCollectionView.snp.makeConstraints {
54 | $0.edges.equalToSuperview()
55 | }
56 | }
57 |
58 | func setRegisterCell() {
59 | StoreDetailImageCollectionViewCell.register(collectionView: imagescrollCollectionView)
60 | }
61 |
62 | }
63 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/View/RecentReviewView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecentReviewView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/21/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class RecentReviewView: UIView {
13 |
14 | // MARK: - UI Components
15 |
16 | private let reviewCountLabel: UILabel = {
17 | let label = UILabel()
18 | label.text = I18N.StoreDetail.testLabel
19 | label.textColor = .Gray800
20 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
21 | return label
22 | }()
23 |
24 | private let averageTitle: UILabel = {
25 | let label = UILabel()
26 | label.text = I18N.StoreDetail.averageTitle
27 | label.textColor = .Gray800
28 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
29 | return label
30 | }()
31 |
32 | private let averageLabel: UILabel = {
33 | let label = UILabel()
34 | label.text = I18N.StoreDetail.testLabel
35 | label.textColor = .Gray800
36 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 24))
37 | return label
38 | }()
39 |
40 | private lazy var starStackView: UIStackView = {
41 | lazy var stackview = UIStackView()
42 | stackview.axis = .horizontal
43 | for _ in 0..<5 {
44 | let starImage = UIImageView()
45 | starImage.image = ImageLiterals.Common.ic_star_empty
46 | starImage.snp.makeConstraints {
47 | $0.size.equalTo(14)
48 | }
49 | stackview.addArrangedSubview(starImage)
50 | }
51 | return stackview
52 | }()
53 |
54 | lazy var detailTableView: UITableView = {
55 | lazy var tableView = UITableView(frame: .zero, style: .plain)
56 | tableView.backgroundColor = .TablingWhite
57 | tableView.sectionFooterHeight = 0
58 | tableView.sectionHeaderTopPadding = 0
59 | tableView.isScrollEnabled = false
60 | tableView.isUserInteractionEnabled = true
61 | tableView.separatorStyle = .none
62 | tableView.allowsSelection = false
63 | return tableView
64 | }()
65 |
66 | private let seperateView: UIView = {
67 | let view = UIView()
68 | view.backgroundColor = .Gray000
69 | return view
70 | }()
71 |
72 | lazy var reviewTableView: UITableView = {
73 | lazy var tableView = UITableView(frame: .zero, style: .plain)
74 | tableView.backgroundColor = .TablingWhite
75 | tableView.sectionFooterHeight = 0
76 | tableView.sectionHeaderTopPadding = 0
77 | tableView.isScrollEnabled = false
78 | tableView.isUserInteractionEnabled = true
79 | tableView.separatorStyle = .none
80 | tableView.allowsSelection = false
81 | return tableView
82 | }()
83 |
84 | private let allReviewLookImage: UIImageView = {
85 | let imageView = UIImageView()
86 | imageView.image = ImageLiterals.StoreDetail.btn_all_review_look
87 | return imageView
88 | }()
89 |
90 | // MARK: - Life Cycles
91 |
92 | override init(frame: CGRect) {
93 | super.init(frame: frame)
94 |
95 | setHierarchy()
96 | setLayout()
97 | setRegisterCell()
98 | }
99 |
100 | @available(*, unavailable)
101 | required init?(coder: NSCoder) {
102 | fatalError("init(coder:) has not been implemented")
103 | }
104 | }
105 |
106 | // MARK: - Extensions
107 | extension RecentReviewView {
108 | func setHierarchy() {
109 | addSubviews(reviewCountLabel, averageTitle, averageLabel, starStackView, detailTableView, seperateView, reviewTableView, allReviewLookImage)
110 | }
111 |
112 | func setLayout() {
113 | reviewCountLabel.snp.makeConstraints {
114 | $0.top.equalToSuperview().inset(25)
115 | $0.leading.equalToSuperview().inset(15)
116 | $0.height.equalTo(24)
117 | }
118 |
119 | averageTitle.snp.makeConstraints {
120 | $0.top.equalTo(reviewCountLabel.snp.bottom).offset(25)
121 | $0.leading.equalToSuperview().inset(52)
122 | }
123 |
124 | averageLabel.snp.makeConstraints {
125 | $0.top.equalTo(averageTitle.snp.bottom)
126 | $0.leading.equalToSuperview().inset(57)
127 | }
128 |
129 | starStackView.snp.makeConstraints {
130 | $0.top.equalTo(averageLabel.snp.bottom).offset(5)
131 | $0.leading.equalToSuperview().inset(39)
132 | $0.height.equalTo(14)
133 | }
134 |
135 | detailTableView.snp.makeConstraints {
136 | $0.top.equalTo(reviewCountLabel.snp.bottom).offset(17)
137 | $0.trailing.equalToSuperview().inset(16)
138 | $0.width.equalTo(196)
139 | $0.height.equalTo(87)
140 | }
141 |
142 | seperateView.snp.makeConstraints {
143 | $0.top.equalTo(detailTableView.snp.bottom).offset(10)
144 | $0.leading.trailing.equalToSuperview()
145 | $0.height.equalTo(3)
146 | }
147 |
148 | reviewTableView.snp.makeConstraints {
149 | $0.top.equalTo(seperateView.snp.bottom)
150 | $0.leading.trailing.equalToSuperview().inset(16)
151 | $0.height.equalTo(515)
152 | }
153 |
154 | allReviewLookImage.snp.makeConstraints {
155 | $0.centerX.equalToSuperview()
156 | $0.top.equalTo(reviewTableView.snp.bottom).offset(16)
157 | $0.bottom.equalToSuperview().inset(30)
158 | $0.width.equalTo(106)
159 | $0.height.equalTo(35)
160 | }
161 | }
162 |
163 | func setRegisterCell() {
164 | DetailStarTableViewCell.register(tableView: detailTableView)
165 | RecentReviewTableViewCell.register(tableView: reviewTableView)
166 | }
167 |
168 | func setDataBind(model: StoreDetailEntity) {
169 | reviewCountLabel.text = "리뷰 \(model.reviewCount)건"
170 | averageLabel.text = String(model.averageStar)+".0"
171 |
172 | for (index, starImage) in starStackView.arrangedSubviews.enumerated() {
173 | if let starImage = starImage as? UIImageView {
174 | if index < Int(model.averageStar) {
175 | starImage.image = ImageLiterals.Common.ic_star_fill
176 | } else {
177 | starImage.image = ImageLiterals.Common.ic_star_empty
178 | }
179 | }
180 | }
181 | }
182 | }
183 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreDetail/View/StoreDetailBottomTabView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreDetailBottomTabView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 민 on 11/20/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | protocol StoreDetailButtonDelegate: AnyObject {
13 | func tablingButtonClicked()
14 | }
15 |
16 | final class StoreDetailBottomTabView: UIView {
17 |
18 | // MARK: - Properties
19 |
20 | weak var storeDetailButtonDelegate: StoreDetailButtonDelegate?
21 |
22 | // MARK: - UI Components
23 |
24 | private lazy var buttonStackView: UIStackView = {
25 | let stackView = UIStackView()
26 | stackView.distribution = .fillEqually
27 | stackView.spacing = 8
28 | stackView.addArrangedSubviews(tablingbutton, reservationbutton, orederButton)
29 | return stackView
30 | }()
31 |
32 | private let tablingbutton: UIButton = {
33 | let button = UIButton()
34 | button.setTitle(I18N.StoreDetail.tablingButtonTitle, for: .normal)
35 | button.setTitleColor(.TablingPrimary, for: .normal)
36 | button.layer.cornerRadius = 6
37 | button.layer.borderColor = UIColor.TablingPrimary.cgColor
38 | button.layer.borderWidth = 1
39 | return button
40 | }()
41 |
42 | private let reservationbutton: UIButton = {
43 | let button = UIButton()
44 | button.setTitle(I18N.StoreDetail.reservationButtonTitle, for: .normal)
45 | button.setTitleColor(.Gray100, for: .normal)
46 | button.layer.cornerRadius = 6
47 | button.layer.borderColor = UIColor.Gray100.cgColor
48 | button.layer.borderWidth = 1
49 | return button
50 | }()
51 |
52 | private let orederButton: UIButton = {
53 | let button = UIButton()
54 | button.setTitle(I18N.StoreDetail.orederButtonTitle, for: .normal)
55 | button.setTitleColor(.Gray100, for: .normal)
56 | button.layer.cornerRadius = 6
57 | button.layer.borderColor = UIColor.Gray100.cgColor
58 | button.layer.borderWidth = 1
59 | return button
60 | }()
61 |
62 | // MARK: - Life Cycles
63 |
64 | override init(frame: CGRect) {
65 | super.init(frame: frame)
66 |
67 | setHierarchy()
68 | setLayout()
69 | setAddTarget()
70 | }
71 |
72 | @available(*, unavailable)
73 | required init?(coder: NSCoder) {
74 | fatalError("init(coder:) has not been implemented")
75 | }
76 | }
77 |
78 | // MARK: - Extensions
79 | extension StoreDetailBottomTabView {
80 | func setUI() {
81 |
82 | }
83 |
84 | func setHierarchy() {
85 | self.addSubview(buttonStackView)
86 | }
87 |
88 | func setLayout() {
89 | buttonStackView.snp.makeConstraints {
90 | $0.leading.trailing.equalToSuperview().inset(16)
91 | $0.top.equalToSuperview().inset(14)
92 | $0.bottom.equalToSuperview().inset(44)
93 | }
94 | }
95 |
96 | func setAddTarget() {
97 | tablingbutton.addTarget(self, action: #selector(tablingButtonTapped), for: .touchUpInside)
98 | }
99 |
100 | @objc
101 | func tablingButtonTapped() {
102 | storeDetailButtonDelegate?.tablingButtonClicked()
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/Cell/LocationCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LocationCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/25/23.
6 | //
7 |
8 | import UIKit
9 | import SnapKit
10 |
11 | final class LocationCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
12 |
13 | // MARK: - UI Components
14 | private let backgroundUIView: UIView = {
15 | let view = UIView()
16 | view.layer.cornerRadius = 16
17 | view.layer.borderWidth = 1
18 | return view
19 | }()
20 |
21 | private let locationLabel: UILabel = {
22 | let label = UILabel()
23 | label.translatesAutoresizingMaskIntoConstraints = false
24 | label.textColor = .Gray400
25 | label.text = "전체"
26 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
27 | return label
28 | }()
29 |
30 | // MARK: - Life Cycles
31 | override init(frame: CGRect) {
32 | super.init(frame: frame)
33 |
34 | setHierarchy()
35 | setLayout()
36 | }
37 |
38 | required init?(coder: NSCoder) {
39 | fatalError("init(coder:) has not been implemented")
40 | }
41 | }
42 |
43 | // MARK: - Extensions
44 | extension LocationCollectionViewCell {
45 |
46 | func setHierarchy() {
47 | addSubviews(backgroundUIView)
48 | backgroundUIView.addSubview(locationLabel)
49 | }
50 |
51 | func setLayout() {
52 | backgroundUIView.snp.makeConstraints {
53 | $0.top.equalToSuperview()
54 | $0.height.equalTo(32)
55 | $0.leading.trailing.equalToSuperview()
56 | }
57 |
58 | locationLabel.snp.makeConstraints {
59 | $0.edges.equalToSuperview().inset(UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16))
60 | }
61 | }
62 |
63 | func configure(with title: String, isSelected: Bool = false) {
64 | backgroundUIView.backgroundColor = isSelected ? .Gray800 : .TablingWhite
65 | backgroundUIView.layer.borderColor = isSelected ? UIColor.Gray800.cgColor : UIColor.Gray200.cgColor
66 | locationLabel.text = title
67 | locationLabel.textColor = isSelected ? .TablingWhite : .Gray400
68 | }
69 |
70 | func setDataBind(model: LocationData) {
71 | locationLabel.text = model.location
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/Cell/StoreListCollectionHeaderView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListCollectionHeaderView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/29/23.
6 | //
7 |
8 | import UIKit
9 |
10 | final class StoreListCollectionHeaderView: UICollectionReusableView {
11 |
12 | static let identifier = "StoreListCollectionHeaderView"
13 |
14 | // MARK: - UI Components
15 |
16 | private let dividerView: UIView = {
17 | let view = UIView()
18 | view.backgroundColor = .Gray000
19 | return view
20 | }()
21 |
22 | private let subTitleLabel: UILabel = {
23 | let label = UILabel()
24 | label.text = "일 평균 대기인원을 기준으로 선정한"
25 | label.textColor = .Gray400
26 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
27 | label.partFontChange(targetString: "일 평균 대기인원", font: .pretendardSemiBold(size: 12), textColor: .Gray400)
28 | return label
29 | }()
30 |
31 | private let titleLabel: UILabel = {
32 | let label = UILabel()
33 | label.text = "서울 남부 인기 매장 BEST"
34 | label.textColor = .Gray800
35 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
36 | label.partColorChange(targetString: "서울 남부", textColor: .TablingSecondary1)
37 | return label
38 | }()
39 |
40 | // MARK: - Life Cycles
41 |
42 | override init(frame: CGRect) {
43 | super.init(frame: frame)
44 |
45 | setUI()
46 | setHierarchy()
47 | setLayout()
48 | }
49 |
50 | @available(*, unavailable)
51 | required init?(coder: NSCoder) {
52 | fatalError("init(coder:) has not been implemented")
53 | }
54 | }
55 |
56 | // MARK: - Extensions
57 | extension StoreListCollectionHeaderView {
58 | func setUI() {
59 | self.backgroundColor = .TablingWhite
60 | }
61 |
62 | func setHierarchy() {
63 | self.addSubviews(dividerView, subTitleLabel, titleLabel)
64 | }
65 |
66 | func setLayout() {
67 | dividerView.snp.makeConstraints {
68 | $0.top.equalToSuperview()
69 | $0.leading.trailing.equalToSuperview()
70 | $0.height.equalTo(1)
71 | }
72 | subTitleLabel.snp.makeConstraints {
73 | $0.top.equalTo(dividerView.snp.bottom).offset(16)
74 | $0.leading.equalToSuperview().inset(16)
75 | }
76 | titleLabel.snp.makeConstraints {
77 | $0.top.equalTo(subTitleLabel.snp.bottom).offset(2)
78 | $0.leading.equalToSuperview().inset(16)
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/Cell/StoreListCollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListCollectionViewCell.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/28/23.
6 | //
7 |
8 | import UIKit
9 | import SnapKit
10 |
11 | final class StoreListCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable {
12 |
13 | // MARK: - UI Components
14 | private let rankLabel: UILabel = {
15 | let label = UILabel()
16 | label.translatesAutoresizingMaskIntoConstraints = false
17 | label.text = I18N.StoreList.storeTestLabel
18 | label.textColor = .Gray800
19 | label.textAlignment = .center
20 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 14))
21 | return label
22 | }()
23 |
24 | private let storeImageView: UIImageView = {
25 | let image = UIImageView()
26 | image.contentMode = .scaleAspectFill
27 | image.layer.cornerRadius = 6
28 | image.clipsToBounds = true
29 | return image
30 | }()
31 |
32 | private let waitingTagLabelView: UIView = {
33 | let view = UIView()
34 | view.backgroundColor = .TablingPrimary
35 | view.layer.cornerRadius = 4
36 | return view
37 | }()
38 |
39 | private let watingTagLabel: UILabel = {
40 | let label = UILabel()
41 | label.text = I18N.StoreList.storeTestLabel
42 | label.translatesAutoresizingMaskIntoConstraints = false
43 | label.textColor = .TablingWhite
44 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 11))
45 | return label
46 | }()
47 |
48 | private lazy var storeReviewStackView: UIStackView = {
49 | let stackView = UIStackView()
50 | stackView.addArrangedSubviews(reviewStarImageView, storeRatingNumLabel, storeReviewNumLabel)
51 | stackView.distribution = .equalSpacing
52 | stackView.axis = .horizontal
53 | stackView.spacing = 3
54 | return stackView
55 | }()
56 |
57 | private let storeNameLabel: UILabel = {
58 | let label = UILabel()
59 | label.translatesAutoresizingMaskIntoConstraints = false
60 | label.textColor = .Gray400
61 | label.text = I18N.StoreList.storeTestLabel
62 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 16))
63 | return label
64 | }()
65 |
66 | private let reviewStarImageView: UIImageView = {
67 | let image = UIImageView(image: ImageLiterals.Common.ic_star_fill)
68 | image.contentMode = .scaleAspectFill
69 | return image
70 | }()
71 |
72 | private let storeRatingNumLabel: UILabel = {
73 | let label = UILabel()
74 | label.text = I18N.StoreList.storeTestLabel
75 | label.translatesAutoresizingMaskIntoConstraints = false
76 | label.textColor = .Gray800
77 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 14))
78 | return label
79 | }()
80 |
81 | private let storeReviewNumLabel: UILabel = {
82 | let label = UILabel()
83 | label.text = I18N.StoreList.storeTestLabel
84 | label.translatesAutoresizingMaskIntoConstraints = false
85 | label.textColor = .Gray800
86 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 14))
87 | return label
88 | }()
89 |
90 | private let storeSubInfoLabel: UILabel = {
91 | let label = UILabel()
92 | label.text = I18N.StoreList.storeTestLabel
93 | label.translatesAutoresizingMaskIntoConstraints = false
94 | label.textColor = .Gray200
95 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 14))
96 | return label
97 | }()
98 |
99 | private let personImageView: UIImageView = {
100 | let image = UIImageView(image: ImageLiterals.StoreList.ic_people)
101 | image.contentMode = .scaleAspectFill
102 | return image
103 | }()
104 |
105 | private let averageWaitingLabel: UILabel = {
106 | let label = UILabel()
107 | label.text = I18N.StoreList.storeTestLabel
108 | label.translatesAutoresizingMaskIntoConstraints = false
109 | label.textColor = .Gray300
110 | label.setLineAndCharacterSpacing(font: .pretendardRegular(size: 12))
111 | return label
112 | }()
113 |
114 | // MARK: - Life Cycles
115 | override init(frame: CGRect) {
116 | super.init(frame: frame)
117 |
118 | setHierarchy()
119 | setLayout()
120 | }
121 |
122 | required init?(coder: NSCoder) {
123 | fatalError("init(coder:) has not been implemented")
124 | }
125 | }
126 |
127 | // MARK: - Extensions
128 | extension StoreListCollectionViewCell {
129 | func setHierarchy() {
130 | addSubviews(rankLabel, storeImageView, storeNameLabel, storeReviewStackView, storeSubInfoLabel, personImageView, averageWaitingLabel)
131 | storeImageView.addSubviews(waitingTagLabelView)
132 | waitingTagLabelView.addSubviews(watingTagLabel)
133 | }
134 |
135 | func setLayout() {
136 | rankLabel.snp.makeConstraints {
137 | $0.centerY.equalToSuperview()
138 | $0.width.equalTo(18)
139 | $0.leading.equalToSuperview().offset(16)
140 | }
141 |
142 | storeImageView.snp.makeConstraints {
143 | $0.top.equalToSuperview().inset(8)
144 | $0.leading.equalTo(rankLabel.snp.trailing).offset(4)
145 | $0.size.equalTo(100)
146 | }
147 |
148 | waitingTagLabelView.snp.makeConstraints {
149 | $0.width.equalTo(50)
150 | $0.height.equalTo(21)
151 | $0.top.leading.equalToSuperview().offset(5)
152 | }
153 |
154 | watingTagLabel.snp.makeConstraints {
155 | $0.centerX.equalToSuperview()
156 | $0.centerY.equalToSuperview()
157 | }
158 |
159 | storeNameLabel.snp.makeConstraints {
160 | $0.top.equalTo(storeImageView).offset(2)
161 | $0.leading.equalTo(storeImageView.snp.trailing).offset(9)
162 | }
163 |
164 | storeReviewStackView.snp.makeConstraints {
165 | $0.top.equalTo(storeNameLabel.snp.bottom).offset(6)
166 | $0.leading.equalTo(storeNameLabel.snp.leading)
167 | }
168 |
169 | reviewStarImageView.snp.makeConstraints {
170 | $0.size.equalTo(13)
171 | }
172 |
173 | storeSubInfoLabel.snp.makeConstraints {
174 | $0.leading.equalTo(storeNameLabel)
175 | $0.top.equalTo(reviewStarImageView.snp.bottom).offset(6)
176 | }
177 |
178 | personImageView.snp.makeConstraints {
179 | $0.size.equalTo(24)
180 | $0.leading.equalTo(storeNameLabel)
181 | $0.top.equalTo(storeSubInfoLabel.snp.bottom).offset(6)
182 | }
183 |
184 | averageWaitingLabel.snp.makeConstraints {
185 | $0.leading.equalTo(personImageView.snp.trailing)
186 | $0.centerY.equalTo(personImageView)
187 | }
188 | }
189 |
190 | func setDataBind(model: StoreListEntity) {
191 | rankLabel.text = "\(tag + 1)"
192 | storeImageView.kfSetImage(url: model.profileImage)
193 | if model.currentWaiting == 0 {
194 | watingTagLabel.text = "대기 없음"
195 | watingTagLabel.textColor = .Gray200
196 | waitingTagLabelView.backgroundColor = .Gray600
197 | } else {
198 | watingTagLabel.text = "대기 \(model.currentWaiting)팀"
199 | }
200 | storeNameLabel.text = "\(model.name)"
201 | storeRatingNumLabel.text = "\(model.averageStar)"
202 | storeReviewNumLabel.text = "(\(model.reviewCount))"
203 | storeSubInfoLabel.text = "\(model.shopCategory)·\(model.shortAddress)"
204 | averageWaitingLabel.text = "일 평균 \(model.averageWaiting)명 대기"
205 | let targetString = "\(model.averageWaiting)"
206 | averageWaitingLabel.partFontChange(targetString: targetString, font: .pretendardSemiBold(size: 12), textColor: .Gray800)
207 | }
208 | }
209 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/View/LocationCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LocationCollectionView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/25/23.
6 | //
7 |
8 | import UIKit
9 | import SnapKit
10 |
11 | final class LocationCollectionView: UIView {
12 |
13 | // MARK: - UI Components
14 | lazy var collectionView: UICollectionView = {
15 | let flowLayout = UICollectionViewFlowLayout()
16 | flowLayout.minimumInteritemSpacing = 6
17 | flowLayout.scrollDirection = .horizontal
18 |
19 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
20 | collectionView.showsHorizontalScrollIndicator = false
21 | collectionView.clipsToBounds = true
22 | collectionView.contentInsetAdjustmentBehavior = .never
23 | collectionView.isUserInteractionEnabled = true
24 | collectionView.allowsSelection = true
25 |
26 | return collectionView
27 | }()
28 |
29 | // MARK: - Life Cycles
30 | override init(frame: CGRect) {
31 | super.init(frame: frame)
32 |
33 | setHierarchy()
34 | setLayout()
35 | setRegisterCell()
36 | }
37 |
38 | @available(*, unavailable)
39 | required init?(coder: NSCoder) {
40 | fatalError("init(coder:) has not been implemented")
41 | }
42 | }
43 |
44 | // MARK: - Extensions
45 | private extension LocationCollectionView {
46 | func setHierarchy() {
47 | addSubviews(collectionView)
48 | }
49 |
50 | func setLayout() {
51 | collectionView.snp.makeConstraints {
52 | $0.edges.equalToSuperview()
53 | }
54 | }
55 |
56 | func setRegisterCell() {
57 | LocationCollectionViewCell.register(collectionView: collectionView)
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/View/StoreListCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListCollectionView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by yeonsu on 11/28/23.
6 | //
7 |
8 | import UIKit
9 | import SnapKit
10 |
11 | final class StoreListCollectionView: UIView {
12 |
13 | // MARK: - UI Components
14 | lazy var collectionView: UICollectionView = {
15 | let flowLayout = UICollectionViewFlowLayout()
16 | flowLayout.minimumLineSpacing = 7
17 | flowLayout.scrollDirection = .vertical
18 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
19 | collectionView.showsVerticalScrollIndicator = false
20 | collectionView.clipsToBounds = true
21 | collectionView.contentInsetAdjustmentBehavior = .never
22 | collectionView.isUserInteractionEnabled = true
23 | collectionView.allowsSelection = true
24 |
25 | return collectionView
26 | }()
27 |
28 | // MARK: - Life Cycles
29 | override init(frame: CGRect) {
30 | super.init(frame: frame)
31 |
32 | setHierarchy()
33 | setLayout()
34 | setRegisterCell()
35 | }
36 |
37 | @available(*, unavailable)
38 | required init?(coder: NSCoder) {
39 | fatalError("init(coder:) has not been implemented")
40 | }
41 | }
42 |
43 | // MARK: - Extensions
44 | private extension StoreListCollectionView {
45 | func setHierarchy() {
46 | addSubviews(collectionView)
47 | }
48 |
49 | func setLayout() {
50 | collectionView.snp.makeConstraints {
51 | $0.edges.equalToSuperview()
52 | }
53 | }
54 |
55 | func setRegisterCell() {
56 | StoreListCollectionViewCell.register(collectionView: collectionView)
57 | collectionView.register(StoreListCollectionHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "StoreListCollectionHeaderView")
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/StoreList/View/StoreListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StoreListView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import Foundation
9 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/TablingList/View/CancelCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CancelCollectionView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class CancelCollectionView: UIView {
13 |
14 | // MARK: - Life Cycles
15 |
16 | override init(frame: CGRect) {
17 | super.init(frame: frame)
18 |
19 | backgroundColor = .TablingWhite
20 | }
21 |
22 | @available(*, unavailable)
23 | required init?(coder: NSCoder) {
24 | fatalError("init(coder:) has not been implemented")
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/TablingList/View/CompleteCollectionView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CompleteCollectionView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/23.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class CompleteCollectionView: UIView {
13 |
14 | // MARK: - UI Components
15 |
16 | lazy var collectionView: UICollectionView = {
17 | let flowLayout = UICollectionViewFlowLayout()
18 | flowLayout.scrollDirection = .vertical
19 | let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
20 | collectionView.showsVerticalScrollIndicator = false
21 | collectionView.clipsToBounds = true
22 | collectionView.contentInsetAdjustmentBehavior = .never
23 | collectionView.isUserInteractionEnabled = true
24 | collectionView.allowsSelection = true
25 | collectionView.contentInset = UIEdgeInsets(top: 5, left: 0, bottom: 5, right: 0)
26 | return collectionView
27 | }()
28 |
29 | // MARK: - Life Cycles
30 |
31 | override init(frame: CGRect) {
32 | super.init(frame: frame)
33 |
34 | setHiearchy()
35 | setLayout()
36 | setRegisterCell()
37 | }
38 |
39 | @available(*, unavailable)
40 | required init?(coder: NSCoder) {
41 | fatalError("init(coder:) has not been implemented")
42 | }
43 | }
44 |
45 | // MARK: - Extensions
46 | private extension CompleteCollectionView {
47 | func setHiearchy() {
48 | addSubview(collectionView)
49 | }
50 |
51 | func setLayout() {
52 | collectionView.snp.makeConstraints {
53 | $0.edges.equalToSuperview()
54 | }
55 | }
56 |
57 | func setRegisterCell() {
58 | CompleteCollectionViewCell.register(collectionView: collectionView)
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/TablingList/View/TablingListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TablingListView.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class TablingListView: UIView {
13 |
14 | // MARK: - UI Components
15 |
16 | let completeCollectionView = CompleteCollectionView()
17 | private let cancelCollectionView = CancelCollectionView()
18 |
19 | private let segmentControl: UISegmentedControl = {
20 | let segment = UISegmentedControl()
21 | segment.selectedSegmentTintColor = .clear
22 | segment.setBackgroundImage(UIImage(), for: .normal, barMetrics: .default)
23 | segment.setDividerImage(UIImage(), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
24 |
25 | for (index, title) in [I18N.TablingList.segementTitle1, I18N.TablingList.segementTitle2].enumerated() {
26 | segment.insertSegment(withTitle: title, at: index, animated: true)
27 | segment.setWidth(156, forSegmentAt: index)
28 | }
29 |
30 | let normalAttributes: [NSAttributedString.Key: Any] = [
31 | .foregroundColor: UIColor.Gray100,
32 | .font: UIFont.pretendardSemiBold(size: 16)
33 | ]
34 | let selectedAttributes: [NSAttributedString.Key: Any] = [
35 | .foregroundColor: UIColor.Gray600,
36 | .font: UIFont.pretendardSemiBold(size: 16)
37 | ]
38 | segment.setTitleTextAttributes(normalAttributes, for: .normal)
39 | segment.setTitleTextAttributes(selectedAttributes, for: .selected)
40 |
41 | segment.translatesAutoresizingMaskIntoConstraints = false
42 | segment.selectedSegmentIndex = 0
43 | return segment
44 | }()
45 |
46 | private let underLineView: UIView = {
47 | let view = UIView()
48 | view.backgroundColor = .Gray600
49 | view.translatesAutoresizingMaskIntoConstraints = false
50 | return view
51 | }()
52 |
53 | private let grayView: UIView = {
54 | let view = UIView()
55 | view.backgroundColor = .Gray000
56 | view.translatesAutoresizingMaskIntoConstraints = false
57 | return view
58 | }()
59 |
60 | // MARK: - Life Cycles
61 |
62 | override init(frame: CGRect) {
63 | super.init(frame: frame)
64 |
65 | setHierarchy()
66 | setLayout()
67 | setAddTarget()
68 | }
69 |
70 | @available(*, unavailable)
71 | required init?(coder: NSCoder) {
72 | fatalError("init(coder:) has not been implemented")
73 | }
74 | }
75 |
76 | // MARK: - Extensions
77 | private extension TablingListView {
78 | func setHierarchy() {
79 | addSubviews(segmentControl, grayView, underLineView, cancelCollectionView, completeCollectionView)
80 | }
81 |
82 | func setLayout() {
83 | segmentControl.snp.makeConstraints {
84 | $0.top.equalTo(safeAreaLayoutGuide).inset(20)
85 | $0.leading.trailing.equalToSuperview().inset(31)
86 | $0.height.equalTo(40)
87 | }
88 |
89 | grayView.snp.makeConstraints {
90 | $0.top.equalTo(segmentControl.snp.bottom)
91 | $0.leading.trailing.equalToSuperview()
92 | $0.height.equalTo(1)
93 | }
94 |
95 | underLineView.snp.makeConstraints {
96 | $0.top.equalTo(segmentControl.snp.bottom)
97 | $0.leading.equalTo(segmentControl.snp.leading).offset(30)
98 | $0.width.equalTo(92)
99 | $0.height.equalTo(2)
100 | }
101 |
102 | completeCollectionView.snp.makeConstraints {
103 | $0.top.equalTo(grayView.snp.bottom).offset(12)
104 | $0.leading.trailing.equalToSuperview()
105 | $0.bottom.equalTo(safeAreaLayoutGuide).offset(-17)
106 | }
107 |
108 | cancelCollectionView.snp.makeConstraints {
109 | $0.top.equalTo(grayView.snp.bottom).offset(12)
110 | $0.leading.trailing.bottom.equalToSuperview()
111 | }
112 | }
113 |
114 | func setAddTarget() {
115 | segmentControl.addTarget(self, action: #selector(didChangeValue(_:)), for: .valueChanged)
116 | segmentControl.addTarget(self, action: #selector(changeSegmentedControlLinePosition(_:)), for: .valueChanged)
117 | }
118 |
119 | @objc
120 | func didChangeValue(_ segment: UISegmentedControl) {
121 | switch segment.selectedSegmentIndex {
122 | case 0:
123 | completeCollectionView.isHidden = false
124 | cancelCollectionView.isHidden = true
125 | case 1:
126 | completeCollectionView.isHidden = true
127 | cancelCollectionView.isHidden = false
128 | default:
129 | break
130 | }
131 | }
132 |
133 | @objc
134 | func changeSegmentedControlLinePosition(_ segment: UISegmentedControl) {
135 | let leadingDistance = Int(156 * CGFloat(segment.selectedSegmentIndex) + (156 - self.underLineView.bounds.width) * 0.5)
136 | UIView.animate(withDuration: 0.2, animations: {
137 | self.underLineView.snp.updateConstraints { $0.leading.equalTo(self.segmentControl.snp.leading).offset(leadingDistance) }
138 | self.layoutIfNeeded()
139 | })
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/TablingList/ViewController/TablingListViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TablingListViewController.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | final class TablingListViewController: UIViewController {
11 |
12 | // MARK: - Properties
13 |
14 | private var tablingListEntity: [TablingListEntity] = []
15 | private var completeEntity: CompleteEntity?
16 | private var navId: Int = 0
17 |
18 | // MARK: - UI Components
19 |
20 | private let tablingListView = TablingListView()
21 | private lazy var collectionView = tablingListView.completeCollectionView.collectionView
22 |
23 | // MARK: - Life Cycles
24 |
25 | override func loadView() {
26 | super.loadView()
27 |
28 | view = tablingListView
29 | }
30 |
31 | override func viewDidLoad() {
32 | super.viewDidLoad()
33 |
34 | getTablingListAPI()
35 | setUI()
36 | setNavigationBar()
37 | setDelegate()
38 | }
39 | }
40 |
41 | // MARK: - Extensions
42 | extension TablingListViewController {
43 | func setUI() {
44 | view.backgroundColor = .TablingWhite
45 | }
46 |
47 | func setNavigationBar() {
48 | let backButton = UIBarButtonItem(image: ImageLiterals.Common.ic_back_b,
49 | style: .plain,
50 | target: self,
51 | action: #selector(backButtonTapped))
52 | navigationItem.leftBarButtonItem = backButton
53 | navigationItem.leftBarButtonItem?.tintColor = .black
54 |
55 | let label = UILabel()
56 | label.text = I18N.TablingList.navigationBarTitle
57 | label.setLineAndCharacterSpacing(font: .pretendardSemiBold(size: 18))
58 | navigationItem.titleView = label
59 | }
60 |
61 | @objc
62 | func backButtonTapped() {
63 | guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
64 | let keyWindow = windowScene.windows.first else {
65 | return
66 | }
67 | let rootVC = UINavigationController(rootViewController: StoreListViewController())
68 | keyWindow.rootViewController = rootVC
69 | }
70 |
71 | func setDelegate() {
72 | collectionView.delegate = self
73 | collectionView.dataSource = self
74 | }
75 | }
76 |
77 | extension TablingListViewController: CompleteDelegate {
78 | func detailButtonTapped(id: Int) {
79 | let nav = WaitingDetailViewController()
80 | nav.orderId = id
81 | self.navigationController?.pushViewController(nav, animated: false)
82 | }
83 |
84 | func shopButtonTappd(shopId: Int) {
85 | let nav = StoreDetailViewController()
86 | nav.shopID = shopId
87 | self.navigationController?.pushViewController(nav, animated: false)
88 | }
89 |
90 | func confirmButtonTapped(index: Int) {
91 | patchCompleteAPI(idx: index)
92 | }
93 | }
94 |
95 | // MARK: - Network
96 | extension TablingListViewController {
97 | func getTablingListAPI() {
98 | TablingListService.shared.getTablingListAPI { networkResult in
99 | switch networkResult {
100 | case .success(let data):
101 | if let data = data as? GenericResponse<[TablingListEntity]> {
102 | if let listData = data.data {
103 | self.tablingListEntity = listData
104 | }
105 | DispatchQueue.main.async {
106 | self.collectionView.reloadData()
107 | }
108 | }
109 | case .requestErr, .serverErr:
110 | print("오류발생")
111 | default:
112 | break
113 | }
114 | }
115 | }
116 |
117 | func patchCompleteAPI(idx: Int) {
118 | TablingListService.shared.patchCompleteAPI(id: idx) { networkResult in
119 | switch networkResult {
120 | case .success(let data):
121 | if let data = data as? GenericResponse {
122 | if let listData = data.data {
123 | self.completeEntity = listData
124 | }
125 | DispatchQueue.main.async {
126 | self.getTablingListAPI()
127 | }
128 | }
129 | case .requestErr, .serverErr:
130 | print("오류발생")
131 | default:
132 | break
133 | }
134 | }
135 | }
136 | }
137 |
138 | extension TablingListViewController: UICollectionViewDelegate {
139 | }
140 |
141 | extension TablingListViewController: UICollectionViewDataSource {
142 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
143 | let cell =
144 | CompleteCollectionViewCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath)
145 | cell.completeDelegate = self
146 | cell.idx = tablingListEntity[indexPath.row].orderID
147 | cell.orderID = tablingListEntity[indexPath.row].orderID
148 | cell.shopID = tablingListEntity[indexPath.row].shopID
149 | cell.setDataBind(model: tablingListEntity[indexPath.row])
150 | return cell
151 | }
152 |
153 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
154 | return tablingListEntity.count
155 | }
156 | }
157 |
158 | extension TablingListViewController: UICollectionViewDelegateFlowLayout {
159 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
160 | return 27
161 | }
162 |
163 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
164 | switch tablingListEntity[indexPath.row].orderStatus {
165 | case "이용 예정":
166 | return CGSize(width: UIScreen.main.bounds.width - 32, height: 355)
167 | case "이용 완료":
168 | return CGSize(width: UIScreen.main.bounds.width - 32, height: 215)
169 | default:
170 | return CGSize(width: UIScreen.main.bounds.width - 32, height: 227)
171 | }
172 | }
173 | }
174 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/Presentation/WaitingDetail/ViewController/WaitingDetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WaitingDetailViewController.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | final class WaitingDetailViewController: UIViewController {
11 |
12 | // MARK: - Properties
13 |
14 | private var waitingEntity: WaitingDetailEntity?
15 | private let waitingDetailView = WaitingDetailView()
16 |
17 | var orderId: Int = 0
18 |
19 | // MARK: - Life Cycles
20 |
21 | override func loadView() {
22 | super.loadView()
23 |
24 | view = waitingDetailView
25 | }
26 |
27 | override func viewDidLoad() {
28 | super.viewDidLoad()
29 |
30 | getWaitingListAPI()
31 | setNavigationBar()
32 | }
33 | }
34 |
35 | // MARK: - Extensions
36 | extension WaitingDetailViewController {
37 |
38 | func setNavigationBar() {
39 | let backButton = UIBarButtonItem(image: ImageLiterals.Common.ic_back_b,
40 | style: .plain,
41 | target: self,
42 | action: #selector(backButtonTapped))
43 | navigationItem.leftBarButtonItem = backButton
44 | navigationItem.leftBarButtonItem?.tintColor = .black
45 |
46 | navigationItem.title = "대기 상세"
47 |
48 | let refreshButton = UIBarButtonItem(image: ImageLiterals.Common.ic_refresh,
49 | style: .plain,
50 | target: self,
51 | action: .none)
52 | navigationItem.rightBarButtonItem = refreshButton
53 | navigationItem.rightBarButtonItem?.tintColor = .black
54 | }
55 |
56 | @objc
57 | func backButtonTapped() {
58 | self.navigationController?.popViewController(animated: false)
59 | }
60 | }
61 |
62 | extension WaitingDetailViewController {
63 | func getWaitingListAPI() {
64 | WaitingDetailService.shared.getWaitingDetailAPI(orderID: orderId) { networkResult in
65 | switch networkResult {
66 | case .success(let data):
67 | if let data = data as? GenericResponse {
68 | if let listData = data.data {
69 | self.waitingEntity = listData
70 | }
71 | DispatchQueue.main.async {
72 | guard let waitingEntity = self.waitingEntity else { return }
73 | self.waitingDetailView.setDataBind(model: waitingEntity)
74 | }
75 | }
76 | case .requestErr, .serverErr:
77 | print("오류발생")
78 | default:
79 | break
80 | }
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/View.swift:
--------------------------------------------------------------------------------
1 | //
2 | // View.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | import SnapKit
11 |
12 | final class View: UIView {
13 |
14 | // MARK: - Properties
15 |
16 | var index: Int = 0
17 |
18 | // MARK: - UI Components
19 |
20 | private let imageView: UIImageView = {
21 | let image = UIImageView()
22 | image.contentMode = .scaleAspectFill
23 | image.image = UIImage(systemName: "apple.logo")
24 | return image
25 | }()
26 |
27 | private lazy var button: UIButton = {
28 | let button = UIButton()
29 | button.backgroundColor = .TablingPrimary
30 | button.setTitleColor(.Gray300, for: .normal)
31 | button.setTitle("버튼", for: .normal)
32 | button.layer.cornerRadius = 24
33 | return button
34 | }()
35 |
36 | // MARK: - Life Cycles
37 |
38 | override init(frame: CGRect) {
39 | super.init(frame: frame)
40 |
41 | setUI()
42 | setHierarchy()
43 | setLayout()
44 | setAddTarget()
45 | setRegisterCell()
46 | }
47 |
48 | @available(*, unavailable)
49 | required init?(coder: NSCoder) {
50 | fatalError("init(coder:) has not been implemented")
51 | }
52 | }
53 |
54 | // MARK: - Extensions
55 | extension View {
56 | func setUI() {
57 |
58 | }
59 |
60 | func setHierarchy() {
61 |
62 | }
63 |
64 | func setLayout() {
65 |
66 | }
67 |
68 | func setAddTarget() {
69 |
70 | }
71 |
72 | @objc
73 | func buttonTapped() {
74 |
75 | }
76 |
77 | func setRegisterCell() {
78 |
79 | }
80 |
81 | func setDataBind() {
82 |
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/Tabling-iOS/Tabling-iOS/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // Tabling-iOS
4 | //
5 | // Created by 고아라 on 2023/11/17.
6 | //
7 |
8 | import UIKit
9 |
10 | final class ViewController: UIViewController {
11 |
12 | // MARK: - Properties
13 |
14 | // MARK: - UI Components
15 |
16 | private let myView = View()
17 |
18 | // MARK: - Life Cycles
19 |
20 | override func loadView() {
21 | super.loadView()
22 |
23 | view = myView
24 | }
25 |
26 | override func viewDidLoad() {
27 | super.viewDidLoad()
28 |
29 | getAPI()
30 | setUI()
31 | setHierarchy()
32 | setLayout()
33 | setDelegate()
34 | }
35 | }
36 |
37 | // MARK: - Extensions
38 | extension ViewController {
39 | func setUI() {
40 |
41 | }
42 |
43 | func setHierarchy() {
44 |
45 | }
46 |
47 | func setLayout() {
48 |
49 | }
50 |
51 | func setDelegate() {
52 |
53 | }
54 | }
55 |
56 | // MARK: - Network
57 |
58 | extension ViewController {
59 | func getAPI() {
60 |
61 | }
62 | }
63 |
64 | //extension ViewController: UICollectionViewDelegate {
65 | //
66 | //}
67 | //
68 | //extension ViewController: UICollectionViewDataSource {
69 | //
70 | //}
71 | //
72 | //extension ViewController: UICollectionViewFlowLayout {
73 | //
74 | //}
75 |
--------------------------------------------------------------------------------