Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

지도 플로우 템플릿 #25

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions gigi.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
08A60E96203450FDCA65CFA81A280D40 /* map_pinup_custom.png in Resources */ = {isa = PBXBuildFile; fileRef = 0014A685BEFE438A55E67987AADFED49 /* map_pinup_custom.png */; };
1087A72C42C029C0D02EB65BFDED13FA /* KakaoPlaceCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34FABB5318195E55BA90A89B90F39B1 /* KakaoPlaceCategory.swift */; };
194CB58C2580B4ED21B304786D1C5B28 /* Result+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B7859F3606BD9FD5AAA0F651FDE8D9 /* Result+.swift */; };
194F1BBC239533AA00F95A6E /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194F1BBB239533AA00F95A6E /* MapViewController.swift */; };
194F1BBE239533B000F95A6E /* MapViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194F1BBD239533B000F95A6E /* MapViewModel.swift */; };
194F1BC02395377D00F95A6E /* ParticipationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194F1BBF2395377D00F95A6E /* ParticipationViewController.swift */; };
194F1BC22395391900F95A6E /* ParticipationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194F1BC12395391900F95A6E /* ParticipationViewModel.swift */; };
19A965FE2387831A00AAC7D3 /* Visitor.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19A965FD2387831A00AAC7D3 /* Visitor.storyboard */; };
19A96600238783D400AAC7D3 /* VisitorNameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A965FF238783D400AAC7D3 /* VisitorNameViewController.swift */; };
19A96602238783DE00AAC7D3 /* VisitorStationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A96601238783DE00AAC7D3 /* VisitorStationViewController.swift */; };
Expand Down Expand Up @@ -78,6 +82,10 @@
018076824BEEA4B63A86E4CCD41D22A0 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
09B7859F3606BD9FD5AAA0F651FDE8D9 /* Result+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+.swift"; sourceTree = "<group>"; };
0B7507E6565EF13E7FFD154D16D1804B /* map_present_background_update.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = map_present_background_update.png; sourceTree = "<group>"; };
194F1BBB239533AA00F95A6E /* MapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = "<group>"; };
194F1BBD239533B000F95A6E /* MapViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewModel.swift; sourceTree = "<group>"; };
194F1BBF2395377D00F95A6E /* ParticipationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipationViewController.swift; sourceTree = "<group>"; };
194F1BC12395391900F95A6E /* ParticipationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipationViewModel.swift; sourceTree = "<group>"; };
19A965FD2387831A00AAC7D3 /* Visitor.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Visitor.storyboard; sourceTree = "<group>"; };
19A965FF238783D400AAC7D3 /* VisitorNameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorNameViewController.swift; sourceTree = "<group>"; };
19A96601238783DE00AAC7D3 /* VisitorStationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorStationViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -225,6 +233,10 @@
isa = PBXGroup;
children = (
19F2B11D238FB98A003ED01C /* Map.storyboard */,
194F1BBB239533AA00F95A6E /* MapViewController.swift */,
194F1BBD239533B000F95A6E /* MapViewModel.swift */,
194F1BBF2395377D00F95A6E /* ParticipationViewController.swift */,
194F1BC12395391900F95A6E /* ParticipationViewModel.swift */,
);
path = Map;
sourceTree = "<group>";
Expand Down Expand Up @@ -567,15 +579,19 @@
files = (
FD0C7AF2C852E38B8290348B3F19127E /* AppDelegate.swift in Sources */,
19A966062387843200AAC7D3 /* NSObject+.swift in Sources */,
194F1BC02395377D00F95A6E /* ParticipationViewController.swift in Sources */,
19F2B125238FC14C003ED01C /* VisitorNameViewModel.swift in Sources */,
C4C3A59991BD5520DA7A8320E2CCD539 /* KakaoMapView.swift in Sources */,
1087A72C42C029C0D02EB65BFDED13FA /* KakaoPlaceCategory.swift in Sources */,
792D417A35A2AA2A08CF898A8B618FF2 /* KakaoSearchByCategoryResponse.swift in Sources */,
19F2B12A238FC3E8003ED01C /* Assets.swift in Sources */,
194F1BBC239533AA00F95A6E /* MapViewController.swift in Sources */,
19F2B123238FBEB1003ED01C /* GigiViewController.swift in Sources */,
80F7E4E400032F853EBA11CD77578008 /* LocationService.swift in Sources */,
19A96600238783D400AAC7D3 /* VisitorNameViewController.swift in Sources */,
194F1BBE239533B000F95A6E /* MapViewModel.swift in Sources */,
19A96604238783FB00AAC7D3 /* VisitorFinishViewController.swift in Sources */,
194F1BC22395391900F95A6E /* ParticipationViewModel.swift in Sources */,
19F2B120238FBA2F003ED01C /* VisitorMainViewModel.swift in Sources */,
19A96602238783DE00AAC7D3 /* VisitorStationViewController.swift in Sources */,
19A96608238784B000AAC7D3 /* VisitorMainViewController.swift in Sources */,
Expand Down
8 changes: 6 additions & 2 deletions gigi/Resources/Storyboard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,16 @@ internal enum StoryboardScene {

internal enum LaunchScreen: StoryboardType {
internal static let storyboardName = "LaunchScreen"

internal static let initialScene = InitialSceneType<UIKit.UIViewController>(storyboard: LaunchScreen.self)
}

internal enum Map: StoryboardType {
internal static let storyboardName = "Map"

internal static let initialScene = InitialSceneType<MapViewController>(storyboard: Map.self)

internal static let mapViewController = SceneType<MapViewController>(storyboard: Map.self, identifier: "MapViewController")

internal static let participationViewController = SceneType<ParticipationViewController>(storyboard: Map.self, identifier: "ParticipationViewController")
}

internal enum Visitor: StoryboardType {
Expand Down
97 changes: 93 additions & 4 deletions gigi/Sources/ViewController/Map/Map.storyboard
Original file line number Diff line number Diff line change
@@ -1,7 +1,96 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="23q-Bq-SUE">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes/>
<scenes>
<!--Participation View Controller-->
<scene sceneID="KR5-Mu-4vS">
<objects>
<viewController storyboardIdentifier="ParticipationViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="K1d-NY-NLl" customClass="ParticipationViewController" customModule="gigi" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="F75-9v-ikG">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="참여멤버 {number}명" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2gI-Qh-DbE">
<rect key="frame" x="30" y="80" width="354" height="21"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="azo-W1-0Tu">
<rect key="frame" x="30" y="730" width="354" height="68"/>
<color key="backgroundColor" red="0.84705882352941175" green="0.84705882352941175" blue="0.84705882352941175" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="68" id="0IK-6m-ozu"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<state key="normal" title="장소 찾기">
<color key="titleColor" red="0.32156862745098036" green="0.32156862745098036" blue="0.32156862745098036" alpha="1" colorSpace="calibratedRGB"/>
</state>
</button>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="dMI-zo-eqE">
<rect key="frame" x="0.0" y="121" width="414" height="589"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
</tableView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<constraints>
<constraint firstItem="azo-W1-0Tu" firstAttribute="leading" secondItem="e8n-bN-91D" secondAttribute="leading" constant="30" id="B7a-EW-gZc"/>
<constraint firstItem="dMI-zo-eqE" firstAttribute="top" secondItem="2gI-Qh-DbE" secondAttribute="bottom" constant="20" id="H3z-Iy-10B"/>
<constraint firstItem="e8n-bN-91D" firstAttribute="trailing" secondItem="2gI-Qh-DbE" secondAttribute="trailing" constant="30" id="JLR-DP-0Ux"/>
<constraint firstItem="2gI-Qh-DbE" firstAttribute="top" secondItem="e8n-bN-91D" secondAttribute="top" constant="36" id="Pqq-i0-LiP"/>
<constraint firstItem="e8n-bN-91D" firstAttribute="trailing" secondItem="azo-W1-0Tu" secondAttribute="trailing" constant="30" id="Qb5-h5-08u"/>
<constraint firstItem="azo-W1-0Tu" firstAttribute="top" secondItem="dMI-zo-eqE" secondAttribute="bottom" constant="20" id="RBx-tT-P7H"/>
<constraint firstItem="dMI-zo-eqE" firstAttribute="leading" secondItem="e8n-bN-91D" secondAttribute="leading" id="bVH-39-nLc"/>
<constraint firstItem="e8n-bN-91D" firstAttribute="bottom" secondItem="azo-W1-0Tu" secondAttribute="bottom" constant="64" id="mDb-p8-8bI"/>
<constraint firstItem="e8n-bN-91D" firstAttribute="trailing" secondItem="dMI-zo-eqE" secondAttribute="trailing" id="wRi-CM-Sru"/>
<constraint firstItem="2gI-Qh-DbE" firstAttribute="leading" secondItem="e8n-bN-91D" secondAttribute="leading" constant="30" id="zh5-nV-8s7"/>
</constraints>
<viewLayoutGuide key="safeArea" id="e8n-bN-91D"/>
</view>
<connections>
<outlet property="findButton" destination="azo-W1-0Tu" id="z9c-gB-HKi"/>
<outlet property="participationCountLabel" destination="2gI-Qh-DbE" id="G2f-qZ-pu2"/>
<outlet property="tableView" destination="dMI-zo-eqE" id="Kg8-g9-jtM"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="fy6-lB-qxO" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="312" y="-1070"/>
</scene>
<!--Map View Controller-->
<scene sceneID="tGQ-Ug-QMG">
<objects>
<viewController storyboardIdentifier="MapViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="23q-Bq-SUE" customClass="MapViewController" customModule="gigi" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="5Ch-SS-QCC">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VLP-5N-gkQ" customClass="MTMapView">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
</view>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="VLP-5N-gkQ" secondAttribute="trailing" id="8d7-bP-IF0"/>
<constraint firstItem="VLP-5N-gkQ" firstAttribute="top" secondItem="5Ch-SS-QCC" secondAttribute="top" id="TGm-KO-iL4"/>
<constraint firstAttribute="bottom" secondItem="VLP-5N-gkQ" secondAttribute="bottom" id="V0e-rb-lNq"/>
<constraint firstItem="VLP-5N-gkQ" firstAttribute="leading" secondItem="5Ch-SS-QCC" secondAttribute="leading" id="jhk-wC-4jn"/>
</constraints>
<viewLayoutGuide key="safeArea" id="IgY-qR-5sl"/>
</view>
<connections>
<outlet property="mapView" destination="VLP-5N-gkQ" id="hvd-JA-ZKJ"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8QM-Rv-O8R" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="313" y="-362"/>
</scene>
</scenes>
</document>
20 changes: 20 additions & 0 deletions gigi/Sources/ViewController/Map/MapViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// MapViewController.swift
// gigi
//
// Created by Presto on 2019/12/02.
// Copyright © 2019 Ieungieung. All rights reserved.
//

import UIKit

import RxCocoa
import RxSwift

final class MapViewController: GigiViewController {
@IBOutlet private var mapView: MTMapView!

override func setup() {}

override func bind() {}
}
32 changes: 32 additions & 0 deletions gigi/Sources/ViewController/Map/MapViewModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// MapViewModel.swift
// gigi
//
// Created by Presto on 2019/12/02.
// Copyright © 2019 Ieungieung. All rights reserved.
//

import RxRelay
import RxSwift

protocol MapViewModelProtocol {
var input: MapViewModelInputProtocol { get }

var output: MapViewModelOutputProtocol { get }
}

protocol MapViewModelInputProtocol {}

protocol MapViewModelOutputProtocol {}

final class MapViewModel {}

extension MapViewModel: MapViewModelProtocol {
var input: MapViewModelInputProtocol { return self }

var output: MapViewModelOutputProtocol { return self }
}

extension MapViewModel: MapViewModelInputProtocol {}

extension MapViewModel: MapViewModelOutputProtocol {}
45 changes: 45 additions & 0 deletions gigi/Sources/ViewController/Map/ParticipationViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//
// ParticipationViewController.swift
// gigi
//
// Created by Presto on 2019/12/02.
// Copyright © 2019 Ieungieung. All rights reserved.
//

import UIKit

import RxCocoa
import RxSwift

final class ParticipationViewController: GigiViewController {
@IBOutlet private var participationCountLabel: UILabel!
@IBOutlet private var tableView: UITableView!
@IBOutlet private var findButton: UIButton!

var viewModel: ParticipationViewModelProtocol!

override func setup() {
tableView.do {
$0.contentInset = .init(top: 0, left: 30, bottom: 0, right: 30)
}
}

override func bind() {
findButton.rx.tap
.subscribe(onNext: { [weak self] in
self?.viewModel.input.presentMapViewController()
})
.disposed(by: disposeBag)

viewModel.output.isFindButtonTapped
.map {
StoryboardScene.Map.mapViewController.instantiate().then {
$0.modalTransitionStyle = .flipHorizontal
}
}
.subscribe(onNext: { [weak self] in
self?.present($0, animated: true, completion: nil)
})
.disposed(by: disposeBag)
}
}
46 changes: 46 additions & 0 deletions gigi/Sources/ViewController/Map/ParticipationViewModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// ParticipationViewModel.swift
// gigi
//
// Created by Presto on 2019/12/02.
// Copyright © 2019 Ieungieung. All rights reserved.
//

import RxRelay
import RxSwift

protocol ParticipationViewModelProtocol {
var input: ParticipationViewModelInputProtocol { get }

var output: ParticipationViewModelOutputProtocol { get }
}

protocol ParticipationViewModelInputProtocol {
func presentMapViewController()
}

protocol ParticipationViewModelOutputProtocol {
var isFindButtonTapped: Observable<Void> { get }
}

final class ParticipationViewModel {
private let isFindButtonTappedRelay = BehaviorRelay<Void?>(value: nil)
}

extension ParticipationViewModel: ParticipationViewModelProtocol {
var input: ParticipationViewModelInputProtocol { return self }

var output: ParticipationViewModelOutputProtocol { return self }
}

extension ParticipationViewModel: ParticipationViewModelInputProtocol {
func presentMapViewController() {
isFindButtonTappedRelay.accept(Void())
}
}

extension ParticipationViewModel: ParticipationViewModelOutputProtocol {
var isFindButtonTapped: Observable<Void> {
return isFindButtonTappedRelay.compactMap { $0 }
}
}