├── .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 | | 스크린샷 2023-10-10 오전 1 51 23 | 69389288 | KakaoTalk_Photo_2023-11-19-13-07-00 | 10 | |

`원격줄서기내역` `대기신청완료팝업` |

`매장상세` `방문인원모달` |

`매장검색` `대기상세` | 11 | 12 |
13 | 14 | ### 📱 시연영상 15 | 스크린샷 2023-10-10 오전 1 51 23 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 | --------------------------------------------------------------------------------