From cee3705b0a2539e8a0d03ed6a66a1c59fee218fa Mon Sep 17 00:00:00 2001 From: caoool Date: Mon, 25 May 2015 22:58:46 -0700 Subject: [PATCH 01/17] bank cards added --- Arrived.xcodeproj/project.pbxproj | 79 +- .../card frame.imageset/Contents.json | 23 + .../card frame.imageset/card frame.png | Bin 0 -> 3755 bytes .../card frame.imageset/card frame@2x.png | Bin 0 -> 11819 bytes .../card frame.imageset/card frame@3x.png | Bin 0 -> 24081 bytes .../default label.imageset/Contents.json | 23 + .../default label.imageset/default label.png | Bin 0 -> 1764 bytes .../default label@2x.png | Bin 0 -> 3769 bytes .../default label@3x.png | Bin 0 -> 5971 bytes Arrived/Main.storyboard | 414 +++++++++-- Classes/Supports/HelperMethods.swift | 23 + Classes/VCs/AddBankCardVC.swift | 290 ++++++++ Classes/VCs/MainScreenVC.swift | 9 +- Classes/VCs/UserBankCardsTVC.swift | 143 +++- Classes/VCs/UserBankCardsTVCell.swift | 18 +- Frameworks/SimpleAlert/AlertController.swift | 57 ++ Frameworks/SimpleAlert/SimpleAlert.swift | 685 ++++++++++++++++++ Frameworks/SimpleAlert/SimpleAlert.xib | 182 +++++ 18 files changed, 1847 insertions(+), 99 deletions(-) create mode 100644 Arrived/Images.xcassets/card frame.imageset/Contents.json create mode 100644 Arrived/Images.xcassets/card frame.imageset/card frame.png create mode 100644 Arrived/Images.xcassets/card frame.imageset/card frame@2x.png create mode 100644 Arrived/Images.xcassets/card frame.imageset/card frame@3x.png create mode 100644 Arrived/Images.xcassets/default label.imageset/Contents.json create mode 100644 Arrived/Images.xcassets/default label.imageset/default label.png create mode 100644 Arrived/Images.xcassets/default label.imageset/default label@2x.png create mode 100644 Arrived/Images.xcassets/default label.imageset/default label@3x.png create mode 100644 Classes/VCs/AddBankCardVC.swift create mode 100644 Frameworks/SimpleAlert/AlertController.swift create mode 100755 Frameworks/SimpleAlert/SimpleAlert.swift create mode 100755 Frameworks/SimpleAlert/SimpleAlert.xib diff --git a/Arrived.xcodeproj/project.pbxproj b/Arrived.xcodeproj/project.pbxproj index ee997eb..61fcb40 100644 --- a/Arrived.xcodeproj/project.pbxproj +++ b/Arrived.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 8901681B1B1431D300180942 /* SimpleAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890168191B1431D300180942 /* SimpleAlert.swift */; }; + 8901681C1B1431D300180942 /* SimpleAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8901681A1B1431D300180942 /* SimpleAlert.xib */; }; 8908FF561AE01ECF00C990DC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8908FF551AE01ECF00C990DC /* AppDelegate.swift */; }; 8908FF601AE01ECF00C990DC /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8908FF5E1AE01ECF00C990DC /* LaunchScreen.xib */; }; 8908FF6C1AE01ECF00C990DC /* ArrivedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8908FF6B1AE01ECF00C990DC /* ArrivedTests.swift */; }; @@ -31,6 +33,8 @@ 890F54D01B01F4120066E835 /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890F54CC1B01F4120066E835 /* AudioPlayer.swift */; }; 890F54D11B01F4120066E835 /* AudioRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890F54CD1B01F4120066E835 /* AudioRecorder.swift */; }; 890F54D31B01F41D0066E835 /* MakeOrderVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 890F54D21B01F41D0066E835 /* MakeOrderVC.swift */; }; + 892C17451B14344E00D2D37F /* AlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892C17441B14344E00D2D37F /* AlertController.swift */; }; + 892C17491B143B2800D2D37F /* AddBankCardVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 892C17481B143B2800D2D37F /* AddBankCardVC.swift */; }; 89471C471B09F6C600EFE101 /* HoshiTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89471C3D1B09F6C600EFE101 /* HoshiTextField.swift */; }; 89471C481B09F6C600EFE101 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 89471C3E1B09F6C600EFE101 /* Info.plist */; }; 89471C491B09F6C600EFE101 /* IsaoTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89471C3F1B09F6C600EFE101 /* IsaoTextField.swift */; }; @@ -106,6 +110,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 890168191B1431D300180942 /* SimpleAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleAlert.swift; sourceTree = ""; }; + 8901681A1B1431D300180942 /* SimpleAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SimpleAlert.xib; sourceTree = ""; }; 8908FF501AE01ECF00C990DC /* Arrived.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Arrived.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8908FF541AE01ECF00C990DC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8908FF551AE01ECF00C990DC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -141,6 +147,8 @@ 890F54CC1B01F4120066E835 /* AudioPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioPlayer.swift; sourceTree = ""; }; 890F54CD1B01F4120066E835 /* AudioRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioRecorder.swift; sourceTree = ""; }; 890F54D21B01F41D0066E835 /* MakeOrderVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MakeOrderVC.swift; sourceTree = ""; }; + 892C17441B14344E00D2D37F /* AlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertController.swift; sourceTree = ""; }; + 892C17481B143B2800D2D37F /* AddBankCardVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddBankCardVC.swift; sourceTree = ""; }; 89471C3D1B09F6C600EFE101 /* HoshiTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HoshiTextField.swift; sourceTree = ""; }; 89471C3E1B09F6C600EFE101 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 89471C3F1B09F6C600EFE101 /* IsaoTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IsaoTextField.swift; sourceTree = ""; }; @@ -175,7 +183,7 @@ 8981A4CE1AF5641500F3046A /* UserLocationsTVCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserLocationsTVCell.swift; sourceTree = ""; }; 8981A4D01AF56DB700F3046A /* UserBankCardsTVCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserBankCardsTVCell.swift; sourceTree = ""; }; 8981A4D21AF58FCE00F3046A /* AddLocationVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationVC.swift; sourceTree = ""; }; - 8981A4D41AF5B0AD00F3046A /* LocationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationManager.swift; sourceTree = ""; }; + 8981A4D41AF5B0AD00F3046A /* LocationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LocationManager.swift; path = Classes/Supports/LocationManager.swift; sourceTree = ""; }; 898455A11AF6EABD0071A31B /* OrdersVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrdersVC.swift; sourceTree = ""; }; 899DA8C81AF40B5E00F0C476 /* ProfileVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileVC.swift; sourceTree = ""; }; 899DA8CA1AF419C000F0C476 /* thumbs_down-104.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "thumbs_down-104.png"; path = "Assets/UI/Icons/thumbs_down-104.png"; sourceTree = ""; }; @@ -200,7 +208,7 @@ 89CAA3DE1B10BA7700D7E4C2 /* UICountingLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICountingLabel.h; sourceTree = ""; }; 89CAA3DF1B10BA7700D7E4C2 /* UICountingLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICountingLabel.m; sourceTree = ""; }; 89D7C6B51AE44D0A00FFD592 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 89D7C6B71AE4796500FFD592 /* ImageLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageLoader.swift; sourceTree = ""; }; + 89D7C6B71AE4796500FFD592 /* ImageLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = Classes/Supports/ImageLoader.swift; sourceTree = ""; }; 89E6FB851B11EA98003A8276 /* UserMenuVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserMenuVC.swift; sourceTree = ""; }; 89E6FB871B12029C003A8276 /* MenuTransitionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuTransitionManager.swift; sourceTree = ""; }; 89EEF4FF1B00720B006881FD /* TestReviewService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestReviewService.swift; sourceTree = ""; }; @@ -226,6 +234,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 890168181B1431D300180942 /* SimpleAlert */ = { + isa = PBXGroup; + children = ( + 890168191B1431D300180942 /* SimpleAlert.swift */, + 8901681A1B1431D300180942 /* SimpleAlert.xib */, + 892C17441B14344E00D2D37F /* AlertController.swift */, + ); + name = SimpleAlert; + path = Frameworks/SimpleAlert; + sourceTree = ""; + }; 8908FF471AE01ECF00C990DC = { isa = PBXGroup; children = ( @@ -317,9 +336,7 @@ isa = PBXGroup; children = ( 890D4C761AE4433400BD05DF /* MyPlayground.playground */, - 89D7C6B71AE4796500FFD592 /* ImageLoader.swift */, 890E3FBC1AEC5B9500F22912 /* HelperMethods.swift */, - 8981A4D41AF5B0AD00F3046A /* LocationManager.swift */, 895822131B04E3AB000DA21E /* Arrived-Bridging-Header.h */, 89E6FB871B12029C003A8276 /* MenuTransitionManager.swift */, ); @@ -329,26 +346,19 @@ 890D4C771AE4433400BD05DF /* VCs */ = { isa = PBXGroup; children = ( + 89C4136D1AF4052C000C2C95 /* MainScreenVC.swift */, + 89F0E9AE1B131CB800038270 /* Resigter & Login */, + 89F0E9AF1B131D7600038270 /* Profile */, + 89F0E9B01B131DAB00038270 /* Misc */, 890F54D21B01F41D0066E835 /* MakeOrderVC.swift */, - 890D4C781AE4433400BD05DF /* AddPaymentInfoVC.swift */, - 890D4C791AE4433400BD05DF /* LoggedInVC.swift */, - 890D4C7A1AE4433400BD05DF /* StartVC.swift */, - 890D4C7C1AE4433400BD05DF /* WelcomeVC.swift */, - 890D72B61B0741C5006360E7 /* UserAgreementVC.swift */, 89D7C6B51AE44D0A00FFD592 /* ViewController.swift */, - 89C4136D1AF4052C000C2C95 /* MainScreenVC.swift */, - 899DA8C81AF40B5E00F0C476 /* ProfileVC.swift */, - 8981A4CA1AF55B8800F3046A /* UserBankCardsTVC.swift */, 8981A4CC1AF55BA100F3046A /* UserLocationsTVC.swift */, 8981A4CE1AF5641500F3046A /* UserLocationsTVCell.swift */, - 8981A4D01AF56DB700F3046A /* UserBankCardsTVCell.swift */, 8981A4D21AF58FCE00F3046A /* AddLocationVC.swift */, 898455A11AF6EABD0071A31B /* OrdersVC.swift */, 89EEF5051B008B05006881FD /* OrderDetailVC.swift */, 890F54C61B0175200066E835 /* OrdersListTVC.swift */, 890F54C81B0175370066E835 /* OrdersListTVCell.swift */, - 8975DAC21B0E2043009D4991 /* WaveformVC.swift */, - 89E6FB851B11EA98003A8276 /* UserMenuVC.swift */, ); path = VCs; sourceTree = ""; @@ -484,6 +494,8 @@ 8958224C1B0504CD000DA21E /* Frameworks */ = { isa = PBXGroup; children = ( + 890168181B1431D300180942 /* SimpleAlert */, + 89D7C6B71AE4796500FFD592 /* ImageLoader.swift */, 89CAA3DD1B10BA7700D7E4C2 /* UICountingLabel */, 89471C501B0C0C1700EFE101 /* RAMAnimatedTabBarController */, 89471C3C1B09F6C600EFE101 /* TextFieldEffects */, @@ -491,6 +503,7 @@ 8958227A1B050AD7000DA21E /* JSSAlertView.swift */, 8958226A1B05061C000DA21E /* GoogleWearAlertView */, 8975DAC01B0E187A009D4991 /* SiriWaveformView.swift */, + 8981A4D41AF5B0AD00F3046A /* LocationManager.swift */, ); name = Frameworks; sourceTree = ""; @@ -545,6 +558,38 @@ path = Frameworks/UICountingLabel; sourceTree = ""; }; + 89F0E9AE1B131CB800038270 /* Resigter & Login */ = { + isa = PBXGroup; + children = ( + 890D4C7A1AE4433400BD05DF /* StartVC.swift */, + 890D4C7C1AE4433400BD05DF /* WelcomeVC.swift */, + 890D72B61B0741C5006360E7 /* UserAgreementVC.swift */, + 890D4C781AE4433400BD05DF /* AddPaymentInfoVC.swift */, + ); + name = "Resigter & Login"; + sourceTree = ""; + }; + 89F0E9AF1B131D7600038270 /* Profile */ = { + isa = PBXGroup; + children = ( + 899DA8C81AF40B5E00F0C476 /* ProfileVC.swift */, + 89E6FB851B11EA98003A8276 /* UserMenuVC.swift */, + 8981A4CA1AF55B8800F3046A /* UserBankCardsTVC.swift */, + 8981A4D01AF56DB700F3046A /* UserBankCardsTVCell.swift */, + 892C17481B143B2800D2D37F /* AddBankCardVC.swift */, + ); + name = Profile; + sourceTree = ""; + }; + 89F0E9B01B131DAB00038270 /* Misc */ = { + isa = PBXGroup; + children = ( + 8975DAC21B0E2043009D4991 /* WaveformVC.swift */, + 890D4C791AE4433400BD05DF /* LoggedInVC.swift */, + ); + name = Misc; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -633,6 +678,7 @@ files = ( 8958224B1B04F0A4000DA21E /* SHSPhoneImage.bundle in Resources */, 89CAA3DC1B10A50A00D7E4C2 /* Images.xcassets in Resources */, + 8901681C1B1431D300180942 /* SimpleAlert.xib in Resources */, 899DA8D31AF41AC700F0C476 /* birthday-104.png in Resources */, 89C4135B1AF1CD91000C2C95 /* Phone Icon.png in Resources */, 89C4136A1AF40402000C2C95 /* Main.storyboard in Resources */, @@ -672,6 +718,7 @@ buildActionMask = 2147483647; files = ( 890A1C441AEAD02F00E6E6D9 /* ServiceHandler.swift in Sources */, + 892C17491B143B2800D2D37F /* AddBankCardVC.swift in Sources */, 890D4C7F1AE4433400BD05DF /* UserService.swift in Sources */, 899DA8C91AF40B5E00F0C476 /* ProfileVC.swift in Sources */, 890E3FBD1AEC5B9500F22912 /* HelperMethods.swift in Sources */, @@ -683,6 +730,7 @@ 890D4C851AE4433400BD05DF /* WelcomeVC.swift in Sources */, 890F54C71B0175200066E835 /* OrdersListTVC.swift in Sources */, 89471C601B0C0C1700EFE101 /* RAMFumeAnimation.swift in Sources */, + 892C17451B14344E00D2D37F /* AlertController.swift in Sources */, 89E6FB861B11EA98003A8276 /* UserMenuVC.swift in Sources */, 89D7C6B81AE4796500FFD592 /* ImageLoader.swift in Sources */, 8981A4CB1AF55B8800F3046A /* UserBankCardsTVC.swift in Sources */, @@ -731,6 +779,7 @@ 8908FF561AE01ECF00C990DC /* AppDelegate.swift in Sources */, 89471C611B0C0C1700EFE101 /* RAMRotationAnimation.swift in Sources */, 890D4C831AE4433400BD05DF /* StartVC.swift in Sources */, + 8901681B1B1431D300180942 /* SimpleAlert.swift in Sources */, 890F54D31B01F41D0066E835 /* MakeOrderVC.swift in Sources */, 890D72B51B0739E5006360E7 /* SHSPhoneTextField.m in Sources */, ); diff --git a/Arrived/Images.xcassets/card frame.imageset/Contents.json b/Arrived/Images.xcassets/card frame.imageset/Contents.json new file mode 100644 index 0000000..999d240 --- /dev/null +++ b/Arrived/Images.xcassets/card frame.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "card frame.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "card frame@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "card frame@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Arrived/Images.xcassets/card frame.imageset/card frame.png b/Arrived/Images.xcassets/card frame.imageset/card frame.png new file mode 100644 index 0000000000000000000000000000000000000000..567efb3ab14ae0f8dcae510f2620e1ab28682a9e GIT binary patch literal 3755 zcmeHK`&ZIu97eoWCvC22rjpA{I|GLk6-Lb~j%c_A(3 zmD^Qchal@wbU)=Z|Ap>Y@1E-#v&`6tP!N;vG6MqHo<@X)e2+DgjvXbJ zr#M-muqj?Gw|4#JAL_{Qc*zKR?eE>Yg_L_G>69;e^c?5z)u2B{dhem>K_GKjlKjVq zdA(2aYIb@we4)Di!}&{c?$c+!-=*SV)%(ewop4!K=D_3uCX9ao=$aQQ-X#=L3hV-x zClamgAZv2!K|Jx!ac{1_a8&tI?{2V#%_g_tOAp#McPOWa=yu2A;`n1-IN%toYw@qL zlF6YFTyjl(VHTNPt?1=QllZ~Y&!z*OY`j!AuA<$EftT`jWISnTkwMqc4kVre)krfQuG%Xfec^-YtnMWqR@=~5w#)QP-&Q2 zS#b^U=;uVpB(jjaLTU{O4mXlwTfF29t}#Xz1Dt6XXWEs-1Inh8?;(a%b+el{3;5oZSoTcx>6ZqSYn7`Yq44f=EruL{TF27{RsX$oeN(X>HK=gf42nC?c?6JvTj zO}4=8f9?t;fB*JT8S{zJMOjd72yu=HWB0RVv}j(}cD@Sq(84O{}cAW{G4s{G4d!64_&UjuQO~dVF+Hcsi?xSnh4RQvv&AYXl)fApH zAg4nQrzx=_MI;5Lp4Yi~mJbvveZ36z(fc|xF#I?wumGc4oC&PnQtHF10o6p8=iLCSPr;)`oj4gkg9FNCGHWz3fI)jU4Hy-G^CjQZD~30 ztA5cuhosdoFv@i1Sgy5*gI6v{3mknka%uax zMp2o;RoyQuE3=EB_K-92RU|TdDoQ}uIg^h@x=8v(gwxWwHR5;x;8Yi1Dz5r38COg3 zn_5-X5Fr3B+;fwJtkhZvf?jg@G8x%Vw&Uyx045-0A^~ea(Zj3om{FmV5jV3dlM%5u ztnv&Xuj0ULw*fyq-x~oG56yoKM4!nX=F-%XhUgU*g@$WSb-0C7rc&dtQJwp$8MzaN zJla|xh~WsWD?)r|1bB8~ueP^simnx{_6>{gA7XnAur*Zz@1vF47j3vDxzDPd!Rk+F zPoNwaxMs(?_}|49+2zUmFV5Nuurj%#X_8IMPE*gVG_j1;g4El$Kp+M><2BZ>U7x2` TFfcB<>Jx-G92Le4Mdkeq;KLC3 literal 0 HcmV?d00001 diff --git a/Arrived/Images.xcassets/card frame.imageset/card frame@2x.png b/Arrived/Images.xcassets/card frame.imageset/card frame@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..11dedd5154d421862fb518d52a04eab7f3c9ab4d GIT binary patch literal 11819 zcmeHNX;_oj5(dPIcrA2MWHW4qs}`vyg|LK0umq?}(XvXyExm-uqA`{bmc(d_s4OXq zVq~c`xFMhy6a|`4(ZpL!BDk;acR;**>wNfvu7xbn^uPt7m!k^AcsOG7AUiIk!(R~+F0 zu?;0q_p5<2cL7c@OsS|BEsKVE=EqbNSc>`yKsl*`%(W(EzGwmYvky5O&VgL8%`^42 zyyS+bx|@hHwedZor*B|r^w&SiZw#l|bJKkS_SCaz9}7VCz7=x91grQhTs3+Mt9}D6HnWzlhRgg2e zLd3{Hm|DH1>AcFcJpr+@1P``aT0m6_P1bwKf%>UjVFrN2%|=@P9`j4FVh0!@^rAlE zG_s~@+P&vScTtl8et8#cVCML{rfUuyDqf2`^zs24HTlS&O%&z1dAngAw7^Gs1b*Y4 z^2z9dFkc4Akw*lIc6pPZmV{#zQ&L4>2B+)&w|)4BW{(46GxIwKFIA+!YOG_;ymI1( zcx>g1gyPh@;Y|je9XW@ES+emvFHUY^+1iyqdRVwvn}fl|4@cm=f-c-L3zt|HFZt&A zsoI+#v1+GYmNyQh_L1F$nV>MA%}MQ9$!^mT*BG;=bR38HsgAc6fw|XwGN|6Q9L0~B zogSa9Kjp%b@7fu;oQ-_v_O+U~2CY)cxjwA1!jR31Q_|JPx$ZtLqn9Z0oh|mG51S>d zS$ngX!yV&ssq=QeBcHU4)^Sud5rUoR4CI8Mh-G6jiB6frU_SFyAgu|P2};T*&YoU; ziTVbYN?O}p*h)8%^?s@s=E->iYYShY-#_JYCwU)f;5%5$#NAZ~*6%vB#24*pJ>SP$ zTDZ9TY`S8cl-qc7?wS0a7#xFt`gc$-i0ur~Z2rP>=3W{B98ccl$Rl0n5g*?mD2C4n zZ;xJGrK?!qwxI}1hV5uBp<<%G(3S5FlwteUZp1jeWA?n;9BCcdn_*_8JmTPwh`3O; zJ-(|p=1jg5Qdf^#=UZ>M9#%&8-74;0w@dZtw58d~1s(s|y)%Ormz*$=*D%<7Yd9vz zQiPN>m`M$EH{SXf`7ApO?IG2ir(C)DL!F#Xa-x~j-?ZIoR8=SU1>H;hL? z5hR-$t~0iU-tft(Q;QuM@fUcoDEH+=qZv82Ai*S_eh zh_$-w8*Ch^vd=C)%J(N@qo5MbQJr<0<=-=(eD;x!Wqb8)uXIM}+>R0R2))=MezBo? zw2d|nUt6rwUH{m$FtqKvV%{q5Dg9FZ=2d`d<7Jp&jar4qgq{ ziAvu!riB~xmg}x-yl~}Tjyi#GS@YSd8#+!fMe9S(H!y^puMH$9^0nCtl^tyfh02bm zghDlc{vClHT+O=)J-FKDfd+LunvM}_HMMQCFVt#kW;&?P*ABMOkfj|Ap&?5u9+v`xM?bB7RSIj#-gXec0)zqw71_sOv5YMT}U z`fobIb!S6N`e;>8c9>UGK{RVR?>LMi$2RugMlTe?zhn;fuJU^Gz+Sx-^YR~Pa*Cpf zv`-`HCLU;(S$dMhUZi&1Qc_XIR_=#h4ppEsQpnQ#W>^cC2`c9fwG1?=x3&Pzi82$* zBvzK96UQqkGow@ra8ie?;u{-nl!v0(^BW(!Ai9`+G_Y;M}$1T`rXmGJ4sTQ*37XIAEz7Y?oip7*6RkF(4$Y0qbUZcORYL0a)n6G~7( zRTC>``-KH&scB{Pt9hW@v(R;*1mWMQp$46oUK+$S51)<}dmJ2UZ5JgjVFLc2pY;i9 z8VA$6lKe!&*5lhmglr}`JTxo1uRCifmw-uoO#n=&@-}+`O4d)!d{b1Z~ChDx}Lg zKupF^=cdkNf#-zE3+e{APxdmCT<6x*bt2oKu0lE-= z$oqzaX`;L~6R(L@AIhsel`~_w3Ua(qKGju@j@FR6yq)lm0ejvVlmy+BRtDsQ$3$f$ z#~LCfOZ<7)KJa{o_znOUZLUh>^bPRWcj*ux^$plB4UU_@D04Ts>ob)3o?`hli9I`@ z=;|4X?v4*&Xy{f%3aU;Z2#%^OY8W0s$59auyn~2k9W8J?=K}bmjE2YfB+A4CxB}Uu zxtSeq1BZt-Veg&!>vFT#-fAUCD!6_4S-0o>+_8|S^Jzx$GqAU??qyTe)padzeybKa zCkYA!zUi;pv8p#R4$iK|K$=m-*gUAa47;o3;%H{RuWGM>4Au|#~$etKPO!zcj#{}XP?Ag$xk5&j*< zLGbl8&GfBy!`P&1TRb2iQM3Uj6@Cfp6_tG0RuXvZbQn5n3qI>&Xf|^S&UtM8$0YT( zMUwNa#@--ds?5AFUJ$thkkcDf+xl`t#>SI0X&{OA!R1E7;0`tFSns&3wyWXQ`)WK3 zN6JIMj1jUjCP>ujxn)0piKLY6j7=>gTM3C_XolN+HFQMVR~1CJWa?2Q9m=LoSmqUwQ2`92PE&tSo3qF=cGo zAXsxYY&KGu5$a+qv5TtwuEBdY!Mir0m}EPAJh{%Kzd{|Ux>htJK%IEoZGTj5;KK){ z#cnJ9y_+FT_+>T;h4W@r=OC!jj_JzJt%>kUK-D(q zg&`Op;CY*Dc*29*FBhqj!;u~;%V$%H(vAe)7=a>87fV59uZ}e~6N5(I8byJb`)(wl zMs6z3T?1HS!j1Ni!h|i;3M8ORua*$=mi#VFVjmf s2Rb>eR2yH5ZJ@l8V(Z3yK#^KsRzmR~+yetN>~FoG?K=Z%x5Xa)AH5MTVE_OC literal 0 HcmV?d00001 diff --git a/Arrived/Images.xcassets/card frame.imageset/card frame@3x.png b/Arrived/Images.xcassets/card frame.imageset/card frame@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3836ec68a2123baf8fc46631879de742143b3935 GIT binary patch literal 24081 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 Y%Tt4tddp7a@h)a^+~Qcakwe(O0e|XYNdN!< literal 0 HcmV?d00001 diff --git a/Arrived/Images.xcassets/default label.imageset/Contents.json b/Arrived/Images.xcassets/default label.imageset/Contents.json new file mode 100644 index 0000000..bb491c8 --- /dev/null +++ b/Arrived/Images.xcassets/default label.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "default label.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "default label@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "default label@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Arrived/Images.xcassets/default label.imageset/default label.png b/Arrived/Images.xcassets/default label.imageset/default label.png new file mode 100644 index 0000000000000000000000000000000000000000..dbec5fcc280a1c22d7aa41715d315920395fcb2a GIT binary patch literal 1764 zcmaKti9ZvJ1BW+9*6_-aW0?}ZnqlF2ec0_6o0615Sxo+$n1^kAy^>;TDxu!$J9NP>DKwNPwS4%GAl+03-E1;XL z^$fX?p*Gj2Ow|zWpdPR);+|rq0PSHQ+fx1fzQrOQl_y)b zpb9r{L)$rLzmM)6Ft1s9H&855LdAjgyz_Mv=2_gqkpuhAi-o3g<>077?8(@|>tWhPb$z*W7bU6}l3%W3rn3Ql)z^`5kyAEuD7 zE91>RR$+33IG00;#DsDfI0}L)SE7r%+|VUz!dX|XB0}L2IwCK~vwIHMUt!7GRKkU5 zKKj_PQDhPw9iUeBmb@lpGwe{d;;2@(cRFn;+X_~Wmk!Dc)B&PJ<#VFjpIu2W3~uZ@ z;-^7KY=v)0xUjz89!bI@LH7i#REo-y`+cn`ZhNWMasPYHpY@$sU#@t!LS_|RjrY%4 zA+aCK{>WBH!&@zkNEGi+;WVUT!%$M4WYH|udA?urwgGMpf21wPK?HeZv@ewDM_?)+ zX=Dk@F@$cG0SQ5{vbLdz>lmN?F9`K!N^mSOT)TEFDelI-Py-y=xpu;NK{yqe;PH?o zj*z9giDoOtcRC`BCL}{OI^OsWVpROO&Cp(j(DjNsfWD5W;V$l|XV!-hW)ynO4n?DO z2$1qW^vqIPAVm5e`k*#>b`fqLLio$ZC^C%EG` zqyY!F{@HLF<3OI@W5>Jqrb!9I)GsmL4u4FB^5f&mN9Zu1PUU)GTnNvy!S#L zs3T{+IM7IaFRb+$*gGY5@0|SjY@67{O?uMK3|g-tZ|7CRCI@CxVK)l!K*iznG&GC1 zHBSE2lpAr#v3-C0r(Agcfo)7uvuAs;+t}B|x1%=jgqqTpTsp%6kdg1NUcKd#5~L`` z`-t&s7gn&M- z$YLMw>M5Qh>qHrD4tt57z@`c-URnSs=97^sjQPmJzA|!~)w0iVr{9bU!-?W!S%doG z$4Rd>aH>!!ffE?4Pj8fRn>hB*K!hkE6+Xc}TUc-0`)v2GRrd9_*H z2{ss=ZfYzgxI0l_Wcl`Wxy{jp6O(1NyfNy|#oY>Q2C^vvpUu0^{|)V$l&5N;Ag3@_ z)6+Qa$+}If5vvC{rJ5HX|1*c?5w258_7)?k&CD%uX>rzE{L^Am5Oj4(TPq=pp)ee4 zh%}Z#fN!y@FP>frpQ(WSG*ODtWp()iu<+Yrw9*x7<~T(pg=%x?#TVGQ7S{|QZplBs zO^`KxdCdv6id>29Usy3uks7|){hu%;8oRp`;A=`HHhd4yZVP}hyK%kN1fTFP>>fn8 literal 0 HcmV?d00001 diff --git a/Arrived/Images.xcassets/default label.imageset/default label@2x.png b/Arrived/Images.xcassets/default label.imageset/default label@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3c4ee9977af06794a9bb8b5a13e091e338824b GIT binary patch literal 3769 zcmc(i_dgT>1IAAw9L{!jWMrH@LuMJLWbbiubXi$hhg_U3D<_%Rnbiqr@3J#9bJkhe zGUB{_-p~6#ygz-PU!R|z=NtRvu?`ItI~4!`pwZLSHvUHy0Dwe{g8W~~vm3Sh2NGXn z9Zf*>Fy|%!Kg)7fh;L4F}2xZd_p(0((?g(G>)xZ;q8O%288+G znx?HkduHKVE!>0*)0&EkZQs3e!(TZ6iag_GQW6byIy%z-3(6AJ!PO0{=)Nw=X0o>W zmqAKoNEWoo)je(=pjMrj(7Wr6@Mt_g1zW>-J#sQokh;kT0t*c7EasLdt2EmZFgeE| z7(L~g?)vwoH~23`9%jcyWN-c@EMw~`Tk?{Bi1BfAF_b{ljZ%^blvn zpQ`bD>B-n#_EOy9O??7!9S4{yB>NnJ=f?*(=xFFSzA94bUim!n|12Ot_q zMUM9Uv_&aW#BQu5)^G5&vpslMcv6mE3`uM{o~Ev+@aRaWLN@PVEQBYZz(SCXn@K9Y z3kT2m^xKP8D;2sBc-vtJicR zv>kb`Dd( z&n$qc*;QwishKR@pFo{7BHD?vRD?xNbHdMD2g53>6YU8-hGRf#8Z3d-@Mf>r7sdip z)81nL@6!E?AwLi>HDVnpuLRzI9NNviSPep@$>_H@F{C)ktHF0|m~id(YM7+86!VEr zqg<%_vx(`%AOxOFkg+CAl&`g)8Mvxo&?*u_Bd8FS@1*VBU5n>92DCv3S!G zlm1PqvuL4}hQ9^6bhh0q_;jO)EXcZT^nwh3+S&AyC<2p!T$US0(?}I1HUezwQfYlj zWC0du#2>Q(`We!=)%pFjtPMe{X=yvthrsPMkums2n{`q6Fe*hxi@Gn#AkLv!g$;oV zd^jRwt90ed@@R2oz3W8)`C81FkMF*lptVcsPT&3K1_Ik~Y8~BbD%2bLFe#j&eSt^) zSF<$3P2#S{r8_0+Ee~AP!^;*dt_A%;6=Pae^kJbQwx`>VQ2|k}yAm1@!uC;*Ewk|I zjx|eliQCX}ZyHymNyU`?aANdDY8}eRZMqg+3m7Gjevr@G7*Na4RtQ~$zsI|Z#pn9S z?)w}M+J~f8*{QPt=Z|Y~IV=(cBXhIjm1aq#nef2wCtS{y7n|~Ep`%371G9z$nLDZH zlGFwerPRgJV{ug)kcw$WtdWl}mR78_2aY(ovs!#2HyltFuHg~+_L&kP9uJ_Fu%^Zo z_AAN#?spHQPssBdS}ukb9@*?px1h#n#pimRm?dF8;>4uF)ZJhRuCZRa$ zfID~?yD!J*2vm9G48N4lT-_}k3@sIca0Z(U;PYOq&AxdPRzno0O1$jHgie}OAe+!d zo?)FdESgia4_aM%$lIa7Ip(`&c6C&LZ;5`%t(l>lXD9V?FpXOTyqGBEb|3FR<`WXE9n=m3{CR10>H@nWkXff8ompi!h2{o^aKNB$xFpV5v~U zx@Y(k>i|crmRq)asoZdy`JrOWaS>gNjcnK}K={p{0wW32Dts+%Zj7$c5D$JV*Yr=% z0&;l2OQ!r_`H|0bS4H?>5>ML7>VfjpVZh(5NaoP=LyWur8X*aS zdNU^pVuKLCFudAX(Kl3%?vbubYLm`K>(5#Bwnu$F93*S{4%eLYv)@II$z|B5eSE}7 zd7pCbel~Awho@AcqPu&@KzbHiQub(N19UE>H80qLI63bVM6$Qhv%%J@S#`Bmmc6kR z1#1oe9O`EJE;On$xHtRTAnRp;l2S!ff7p7?OE$AkdoX!~Vj^p!n_9eP?6%6ZmiSnf z(pqkmDI9G7kVm0R;873^e4_>4cr@X5TN)zQ!Qw1vKTDsd5SF>jLa+F=VLT=UWY~br z=C9yv^Um~ZkoBYVHN?S*1A_JLh*-l{Gl)y+70ciYWIkFQ2sWa(Ei4c^Dc@kTW9{7c z=i<0F;Hk~47f)anww50^QaP_2hcJbYHox&M<)V~4@qn~MkfQX`{k*5LzTORruR=7r z%T&cs5?oj8E@-w{SbZ&2hpCM{2;4)}@^>3q~2mQ2WW!|ZCPcQBL}PRKcj_HJs0 zzrL5T6!m@8+RXH?D7`(-@9C%}{VV@<$1e#iu^0loXp;vSOfeZY=ebZ#!Nit@DOebA z`z{DbH|A1{`gQBN`ASTvnet$@?&z_jsS)F}OWUscb}36uhB#bwrQB=EI|oODC)7n= z<-OmT!wO4>#3+#&GO!```J(R_2Df4UAXhvW!q4{8Zd?9cxC^VOezL&Nw1G21gw7M+ z8Zz^jzN^-kdEW@JF5bZfH8)2e^kSI~2yZk$-m}7tniKjKQ;WZD?ooe@T3WXOGqRAn zx^-H;x@c6b4nmtmLzI8xS<+=kUc|KoM?<96{Fn69T7=B}Z1~R1pCu-`2j^|;-M>Io z6p@|36CD%X-7W#Y{CgDlNfwEnbTU^yZF*L!cXr%sO&f(2MeARD%joy1xd zo1^9GdGPsk$Xm7BH5Oy!6O7r5^GwG@EwPkJT)kJ>OlC!w!&`q&e=l;Ywr% zQQo(t@OOK86rX)XX&{m}xKHa{z8j>xRO(&94c=(~6<+dSj59N8o7)#Z1;woQ zIbL14vhUPyEUmYbiQn5Z5(5#$4kY=i-)-|82(X%r#hpGkoo&v_-NYr3jgXHo_${Je=m$zbU$61DB*kz8pIVj%rd0XLn15{L! z)llN9ryd|b3-K{v7xJLiQFu*seC9AA)R#gB z9|O_U9k+8}`Xh~g@5B@T`frI?Fm&=-HW71L%R3f1s#5f-^t7yk?&0Cl$RkSrGPLrK zepdS0wJow8wWbV2+!6haG{3Cl{F%`9999Ko;sK4|W;QVQ?LIWhx-Vk11d^SJ>pitEYO4W@h2f`-AnIer9N+f7m8-5UJ2)eyY4aLE__&+pf xTsNQSs@x;%xL)aKvHiaY*Z(~48F$1r$;j|(O@#iQ+&>ou=skF>U9IVe`VVab<_!P< literal 0 HcmV?d00001 diff --git a/Arrived/Images.xcassets/default label.imageset/default label@3x.png b/Arrived/Images.xcassets/default label.imageset/default label@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d179babd0f741f91e4bf6de6faaa57c9d1eada46 GIT binary patch literal 5971 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 ovJ|&B - - @@ -1582,19 +1650,13 @@ Moderation is conducted through a democratic system known as the Tribunal. In th - - - + - - - - - + @@ -1923,7 +1985,25 @@ Moderation is conducted through a democratic system known as the Tribunal. In th - + + + + + + + + + + + + + + + + + + + diff --git a/Classes/VCs/AddLocationVC.swift b/Classes/VCs/AddLocationVC.swift index 205f80e..6750b2d 100755 --- a/Classes/VCs/AddLocationVC.swift +++ b/Classes/VCs/AddLocationVC.swift @@ -12,6 +12,20 @@ import AddressBookUI class AddLocationVC: UIViewController, MKMapViewDelegate, UISearchBarDelegate { + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func viewWillAppear(animated: Bool) { + super.viewWillAppear(true) + + navigationController?.navigationBar.tintColor = UIColor.whiteColor() + + navigationController?.navigationBar.topItem!.title = ""; + } + + /* @IBOutlet weak var addressField: UITextField! @IBOutlet weak var mapView: MKMapView! @@ -32,6 +46,10 @@ class AddLocationVC: UIViewController, MKMapViewDelegate, UISearchBarDelegate { super.viewDidLoad() // Do any additional setup after loading the view. + + navigationController?.navigationBar.tintColor = UIColor.whiteColor() + + navigationController?.navigationBar.topItem!.title = ""; } override func didReceiveMemoryWarning() { @@ -136,6 +154,6 @@ class AddLocationVC: UIViewController, MKMapViewDelegate, UISearchBarDelegate { } } - + */ } diff --git a/Classes/VCs/UserLocationsTVC.swift b/Classes/VCs/UserLocationsTVC.swift index 83df1ca..1e3ee11 100755 --- a/Classes/VCs/UserLocationsTVC.swift +++ b/Classes/VCs/UserLocationsTVC.swift @@ -9,8 +9,180 @@ import UIKit import MapKit -class UserLocationsTVC: UITableViewController, MKMapViewDelegate { +class CustomPointAnnotation: MKPointAnnotation { + var imageName: String! +} + +class UserLocationsTVC: UITableViewController, MKMapViewDelegate, UITableViewDelegate { + + private struct address { + var street: String? + var city: String? + var state: String? + var country: String? + var post: Int? + var latitude: Double? + var longitude: Double? + } + + private var address1 = address(street: "Apple Inc., Infinite Loop", city: "Cupertino", state: "CA", country: "USA", post: 95014, latitude: 37.3320951, longitude: -122.0307425) + private var address2 = address(street: "14055 Chester Ave", city: "Saratoga", state: "CA", country: "USA", post: 95070, latitude: 37.264462, longitude: -122.001732) + private var address3 = address(street: "14055 Chester Ave", city: "Saratoga", state: "CA", country: "USA", post: 95070, latitude: 37.264462, longitude: -122.001732) + + private var addresses = [address]() + + private var checkedIndexPath : NSIndexPath? + + override func viewDidLoad() { + super.viewDidLoad() + + addresses = [address1, address2, address3] + + // hide seperator below each cell + tableView.separatorStyle = UITableViewCellSeparatorStyle.None + + // set top margin of table view + tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0) + } + + override func viewWillAppear(animated: Bool) { + super.viewWillAppear(true) + + title = "Addresses" + tableView.reloadData() + } + + // MARK: - TableView Delegates + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return addresses.count + } + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("UserLocationsTVCell", forIndexPath: indexPath) as! UserLocationsTVCell + + + + var cellAddress = addresses[indexPath.row] + cell.streetLabel.text = cellAddress.street + cell.cityLabel.text = cellAddress.city + cell.stateLabel.text = cellAddress.state + cell.countryLabel.text = cellAddress.country + cell.postLabel.text = "\(cellAddress.post!)" + + cell.map.delegate = self + + let location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: cellAddress.latitude!, longitude: cellAddress.longitude!) + let regionRadius: CLLocationDistance = 1000 + let coordinateRegion = MKCoordinateRegionMakeWithDistance(location, regionRadius * 2.0, regionRadius * 2.0) + cell.map.setRegion(coordinateRegion, animated: true) + + /* display annotation in middle + var annotation = CustomPointAnnotation() + annotation.coordinate = location + annotation.imageName = "map pin.png" + cell.map.addAnnotation(annotation) + */ + cell.map.showsUserLocation = true + + /* encontered a problem where only the last map got updated + var locationManager = LocationManager.sharedInstance + let addressString = "\(cellAddress.street), \(cellAddress.city), \(cellAddress.state) \(cellAddress.post), \(cellAddress.country)" + locationManager.geocodeAddressString(address: addressString) { + (geocodeInfo,placemark,error) -> Void in + + if(error != nil) { + println(error) + } else { + print(geocodeInfo!) + let location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: Double((geocodeInfo!["latitude"]! as! NSString).doubleValue), longitude: Double((geocodeInfo!["longitude"]! as! NSString).doubleValue)) + let regionRadius: CLLocationDistance = 1000 + let coordinateRegion = MKCoordinateRegionMakeWithDistance(location, regionRadius * 2.0, regionRadius * 2.0) + cell.map.setRegion(coordinateRegion, animated: true) + } + } + */ + + cell.selectionStyle = .None + + return cell + } + + override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + + if (self.checkedIndexPath != nil) { + if let var cell = tableView.cellForRowAtIndexPath(self.checkedIndexPath!) as? UserLocationsTVCell { + fadeOutView(cell.defaultIndicator, 0.35) + } + + } + + var cell = tableView.cellForRowAtIndexPath(indexPath) as! UserLocationsTVCell + fadeInView(cell.defaultIndicator, 0.35) + + self.checkedIndexPath = indexPath + } + + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == UITableViewCellEditingStyle.Delete { + // Delete the row from the data source + addresses.removeAtIndex(indexPath.row) + + // also need to delete from the server) + + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + + + + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + + func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { + if !(annotation is CustomPointAnnotation) { + return nil + } + + let reuseId = "test" + + var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) + if anView == nil { + anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) + anView.canShowCallout = true + } + else { + anView.annotation = annotation + } + + //Set annotation-specific properties **AFTER** + //the view is dequeued or created... + + let cpa = annotation as! CustomPointAnnotation + anView.image = UIImage(named:cpa.imageName) + + return anView + } + + // MARK: - Navigation + + + @IBAction func dismissScene(sender: UIBarButtonItem) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + + + /* var locations = [[String:AnyObject]]() override func viewDidLoad() { @@ -147,6 +319,7 @@ class UserLocationsTVC: UITableViewController, MKMapViewDelegate { // Pass the selected object to the new view controller. } */ - + */ + } diff --git a/Classes/VCs/UserLocationsTVCell.swift b/Classes/VCs/UserLocationsTVCell.swift index a29954a..36e4e90 100755 --- a/Classes/VCs/UserLocationsTVCell.swift +++ b/Classes/VCs/UserLocationsTVCell.swift @@ -11,18 +11,25 @@ import MapKit class UserLocationsTVCell: UITableViewCell { - @IBOutlet weak var addressLabel: UILabel! @IBOutlet weak var map: MKMapView! + @IBOutlet weak var streetLabel: UILabel! + @IBOutlet weak var cityLabel: UILabel! + @IBOutlet weak var stateLabel: UILabel! + @IBOutlet weak var countryLabel: UILabel! + @IBOutlet weak var postLabel: UILabel! + + @IBOutlet weak var myView: UIView! + @IBOutlet weak var defaultIndicator: UIImageView! override func awakeFromNib() { super.awakeFromNib() - // Initialization code - } - - override func setSelected(selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - // Configure the view for the selected state + myView.layer.borderWidth = 0.3 + myView.layer.borderColor = UIColor.lightGrayColor().CGColor + myView.layer.cornerRadius = 12 + + defaultIndicator.layer.backgroundColor = UIColorFromHex(0x3ABE68, alpha: 0.65).CGColor + defaultIndicator.alpha = 0 } } From 7a6a97332312fb7328e5723f1d192fdaa4a6da5d Mon Sep 17 00:00:00 2001 From: caoool Date: Tue, 26 May 2015 04:34:54 -0700 Subject: [PATCH 03/17] user addresses finished --- Arrived.xcodeproj/project.pbxproj | 28 +++- Arrived/Main.storyboard | 146 ++++++++++++++++---- Classes/VCs/AddLocationVC.swift | 212 +++++++++++++++++++++++++++++ Classes/VCs/UserLocationsTVC.swift | 1 + 4 files changed, 351 insertions(+), 36 deletions(-) diff --git a/Arrived.xcodeproj/project.pbxproj b/Arrived.xcodeproj/project.pbxproj index 90e365e..0b8fbb3 100644 --- a/Arrived.xcodeproj/project.pbxproj +++ b/Arrived.xcodeproj/project.pbxproj @@ -398,6 +398,26 @@ name = UI; sourceTree = ""; }; + 892C174A1B147CC000D2D37F /* Banking */ = { + isa = PBXGroup; + children = ( + 8981A4CA1AF55B8800F3046A /* UserBankCardsTVC.swift */, + 8981A4D01AF56DB700F3046A /* UserBankCardsTVCell.swift */, + 892C17481B143B2800D2D37F /* AddBankCardVC.swift */, + ); + name = Banking; + sourceTree = ""; + }; + 892C174B1B147CD900D2D37F /* Addresses */ = { + isa = PBXGroup; + children = ( + 8981A4CC1AF55BA100F3046A /* UserLocationsTVC.swift */, + 8981A4CE1AF5641500F3046A /* UserLocationsTVCell.swift */, + 8981A4D21AF58FCE00F3046A /* AddLocationVC.swift */, + ); + name = Addresses; + sourceTree = ""; + }; 89471C3C1B09F6C600EFE101 /* TextFieldEffects */ = { isa = PBXGroup; children = ( @@ -571,12 +591,8 @@ children = ( 899DA8C81AF40B5E00F0C476 /* ProfileVC.swift */, 89E6FB851B11EA98003A8276 /* UserMenuVC.swift */, - 8981A4CA1AF55B8800F3046A /* UserBankCardsTVC.swift */, - 8981A4D01AF56DB700F3046A /* UserBankCardsTVCell.swift */, - 892C17481B143B2800D2D37F /* AddBankCardVC.swift */, - 8981A4CC1AF55BA100F3046A /* UserLocationsTVC.swift */, - 8981A4CE1AF5641500F3046A /* UserLocationsTVCell.swift */, - 8981A4D21AF58FCE00F3046A /* AddLocationVC.swift */, + 892C174A1B147CC000D2D37F /* Banking */, + 892C174B1B147CD900D2D37F /* Addresses */, ); name = Profile; sourceTree = ""; diff --git a/Arrived/Main.storyboard b/Arrived/Main.storyboard index f72e32b..20f0d8d 100644 --- a/Arrived/Main.storyboard +++ b/Arrived/Main.storyboard @@ -1613,46 +1613,132 @@ Moderation is conducted through a democratic system known as the Tribunal. In th - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + - - - - - + + + + + + + + + + + + diff --git a/Classes/VCs/AddLocationVC.swift b/Classes/VCs/AddLocationVC.swift index 6750b2d..4dd3076 100755 --- a/Classes/VCs/AddLocationVC.swift +++ b/Classes/VCs/AddLocationVC.swift @@ -12,9 +12,37 @@ import AddressBookUI class AddLocationVC: UIViewController, MKMapViewDelegate, UISearchBarDelegate { + @IBOutlet weak var myView: UIView! + @IBOutlet weak var mapView: MKMapView! + + @IBOutlet weak var streetLabel: UITextField! + @IBOutlet weak var cityLabel: UITextField! + @IBOutlet weak var stateLabel: UITextField! + @IBOutlet weak var postLabel: UITextField! + @IBOutlet weak var countryLabel: UITextField! + + + // for search location + private var latitude: Double? + private var longitude: Double? + + private var searchController: UISearchController! + private var annotation: MKAnnotation! + private var localSearchRequest: MKLocalSearchRequest! + private var localSearch: MKLocalSearch! + private var localSearchResponse: MKLocalSearchResponse! + private var error: NSError! + private var pointAnnotation: MKPointAnnotation! + private var pinAnnotationView: MKPinAnnotationView! + + // for user location + var manager: CLLocationManager! + var myLocations: [CLLocation] = [] override func viewDidLoad() { super.viewDidLoad() + + updateUIWithUserLocation() } override func viewWillAppear(animated: Bool) { @@ -23,7 +51,191 @@ class AddLocationVC: UIViewController, MKMapViewDelegate, UISearchBarDelegate { navigationController?.navigationBar.tintColor = UIColor.whiteColor() navigationController?.navigationBar.topItem!.title = ""; + + myView.layer.borderWidth = 0.3 + myView.layer.borderColor = UIColor.lightGrayColor().CGColor + myView.layer.cornerRadius = 12 + + + } + + // MARK: - Functionalities + + func updateUIWithUserLocation() { + + manager = CLLocationManager() + manager.desiredAccuracy = kCLLocationAccuracyBest + manager.requestAlwaysAuthorization() + + + if CLLocationManager.locationServicesEnabled() { + manager.startUpdatingLocation() + + let latitude = manager.location.coordinate.latitude + let longitude = manager.location.coordinate.longitude + let location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) + let regionRadius: CLLocationDistance = 1000 + let coordinateRegion = MKCoordinateRegionMakeWithDistance(location, regionRadius * 2.0, regionRadius * 2.0) + mapView.setRegion(coordinateRegion, animated: true) + + var locationManager = LocationManager.sharedInstance + locationManager.reverseGeocodeLocationWithLatLon(latitude: latitude, longitude: longitude) { (reverseGecodeInfo,placemark,error) -> Void in + + if(error != nil) { + + println(error) + } else { + + println(reverseGecodeInfo!) + let address = reverseGecodeInfo!["formattedAddress"] as! String + var splitAddress = address.componentsSeparatedByString(", ") + let country = reverseGecodeInfo!["country"] as? String + let post = reverseGecodeInfo!["postalCode"] as? String + let state = reverseGecodeInfo!["administrativeArea"] as? String + let city = reverseGecodeInfo!["locality"] as? String + for i in 1...3 { + if splitAddress.count > 1 { + splitAddress.removeLast() + } + } + let joiner = ", " + let street = joiner.join(splitAddress) + + dispatch_async(dispatch_get_main_queue()) { + // do ui updates here + + self.streetLabel.text = street + self.cityLabel.text = city + self.stateLabel.text = state + self.postLabel.text = post + self.countryLabel.text = country + } + } + + } + } + + } + + @IBAction func showSearchBar(sender: AnyObject) { + searchController = UISearchController(searchResultsController: nil) + searchController.hidesNavigationBarDuringPresentation = false + self.searchController.searchBar.delegate = self + presentViewController(searchController, animated: true, completion: nil) + } + + func searchBarSearchButtonClicked(searchBar: UISearchBar) { + + searchBar.resignFirstResponder() + dismissViewControllerAnimated(true, completion: nil) + if self.mapView.annotations.count != 0 { + annotation = self.mapView.annotations[0] as! MKAnnotation + self.mapView.removeAnnotation(annotation) + } + + localSearchRequest = MKLocalSearchRequest() + localSearchRequest.naturalLanguageQuery = searchBar.text + localSearch = MKLocalSearch(request: localSearchRequest) + localSearch.startWithCompletionHandler { (localSearchResponse, error) -> Void in + + if localSearchResponse == nil { + var alert = UIAlertView(title: nil, message: "Place not found", delegate: self, cancelButtonTitle: "Try again") + alert.show() + return + } + + self.latitude = localSearchResponse.boundingRegion.center.latitude + self.longitude = localSearchResponse.boundingRegion.center.longitude + + self.pointAnnotation = CustomPointAnnotation() + self.pointAnnotation.title = searchBar.text + self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: self.latitude!, longitude: self.longitude!) + + + self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil) + // self.mapView.centerCoordinate = self.pointAnnotation.coordinate + + + let center = CLLocationCoordinate2D(latitude: self.latitude!, longitude: self.longitude!) + let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) + + self.mapView.setRegion(region, animated: true) + self.mapView.addAnnotation(self.pinAnnotationView.annotation) + + var locationManager = LocationManager.sharedInstance + locationManager.reverseGeocodeLocationWithLatLon(latitude: self.latitude!, longitude: self.longitude!) { (reverseGecodeInfo,placemark,error) -> Void in + + if(error != nil) { + + println(error) + } else { + + println(reverseGecodeInfo!) + let address = reverseGecodeInfo!["formattedAddress"] as! String + var splitAddress = address.componentsSeparatedByString(", ") + let country = reverseGecodeInfo!["country"] as! String + let post = reverseGecodeInfo!["postalCode"] as! String + let state = reverseGecodeInfo!["administrativeArea"] as! String + let city = reverseGecodeInfo!["locality"] as! String + splitAddress.removeLast() + splitAddress.removeLast() + splitAddress.removeLast() + let joiner = ", " + let street = joiner.join(splitAddress) + + dispatch_async(dispatch_get_main_queue()) { + // do ui updates here + + self.streetLabel.text = street + self.cityLabel.text = city + self.stateLabel.text = state + self.postLabel.text = post + self.countryLabel.text = country + } + } + + } + } + } + + @IBAction func addAddress(sender: UIButton) { + navigationController?.popViewControllerAnimated(true) + } + + // MARK: - Delegates + + // Customize annotation appearance + func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { + if !(annotation is CustomPointAnnotation) { + return nil + } + + let reuseId = "test" + + var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) + if anView == nil { + anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) + anView.canShowCallout = true + } + else { + anView.annotation = annotation + } + + //Set annotation-specific properties **AFTER** + //the view is dequeued or created... + + let cpa = annotation as! CustomPointAnnotation + anView.image = UIImage(named: "map pin.png") + + return anView + } + + /* + func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { + var locValue:CLLocationCoordinate2D = manager.location.coordinate + println("locations = \(locValue.latitude) \(locValue.longitude)") } + */ /* @IBOutlet weak var addressField: UITextField! diff --git a/Classes/VCs/UserLocationsTVC.swift b/Classes/VCs/UserLocationsTVC.swift index 1e3ee11..2612336 100755 --- a/Classes/VCs/UserLocationsTVC.swift +++ b/Classes/VCs/UserLocationsTVC.swift @@ -148,6 +148,7 @@ class UserLocationsTVC: UITableViewController, MKMapViewDelegate, UITableViewDel } + // Customize annotation appearance func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if !(annotation is CustomPointAnnotation) { return nil From f5b77b3d034d2958cd8f0d5686a450d03b67decb Mon Sep 17 00:00:00 2001 From: caoool Date: Tue, 26 May 2015 07:21:31 -0700 Subject: [PATCH 04/17] Chang pin finished --- Arrived/Main.storyboard | 17 +-- Classes/VCs/UserMenuVC.swift | 109 ++++++++++++++++++- Frameworks/SimpleAlert/AlertController.swift | 14 ++- 3 files changed, 128 insertions(+), 12 deletions(-) diff --git a/Arrived/Main.storyboard b/Arrived/Main.storyboard index 20f0d8d..c4bad3d 100644 --- a/Arrived/Main.storyboard +++ b/Arrived/Main.storyboard @@ -959,12 +959,6 @@ Moderation is conducted through a democratic system known as the Tribunal. In th - + @@ -2117,7 +2120,7 @@ Moderation is conducted through a democratic system known as the Tribunal. In th - + diff --git a/Classes/VCs/UserMenuVC.swift b/Classes/VCs/UserMenuVC.swift index 27f6a8e..1b6aca1 100644 --- a/Classes/VCs/UserMenuVC.swift +++ b/Classes/VCs/UserMenuVC.swift @@ -8,7 +8,7 @@ import UIKit -class UserMenuVC: UIViewController { +class UserMenuVC: UIViewController, UITextFieldDelegate { // create instance of our custom transition manager let transitionManager = MenuTransitionManager() @@ -33,6 +33,11 @@ class UserMenuVC: UIViewController { @IBOutlet weak var cancelButton: UIButton! + private var pinChanngeTextField1: UITextField! + private var pinChanngeTextField2: UITextField! + private var pinChanngeTextField3: UITextField! + private var pinChanngeTextField4: UITextField! + override func viewDidLoad() { super.viewDidLoad() @@ -45,6 +50,108 @@ class UserMenuVC: UIViewController { cancelButton.layer.cornerRadius = cancelButton.frame.height/2 } + // MARK: - Functionalities + + @IBAction func changePin(sender: UIButton) { + let alert = AlertController(title: "Pin Code", message: "We need to verify you identity in order to protect your account, please enter verification code sent to your phone number 😘", style: .Alert) + showChangePinAlert(alert) + } + + func showChangePinAlert(alert: SimpleAlert.Controller) { + + var verificationCode: Int? + var oldPin: Int? + var newPin: Int? + var newPin2: Int? + + alert.addTextFieldWithConfigurationHandler() { textField in + self.addDoneButtonOnKeyboard(textField) + self.pinChanngeTextField1 = textField + textField.keyboardType = UIKeyboardType.NumberPad + textField.placeholder = "Verification code" + } + + alert.addTextFieldWithConfigurationHandler() { textField in + self.addDoneButtonOnKeyboard(textField) + self.pinChanngeTextField2 = textField + textField.keyboardType = UIKeyboardType.NumberPad + textField.placeholder = "Old pin code" + textField.secureTextEntry = true + } + + alert.addTextFieldWithConfigurationHandler() { textField in + self.addDoneButtonOnKeyboard(textField) + self.pinChanngeTextField3 = textField + textField.keyboardType = UIKeyboardType.NumberPad + textField.placeholder = "New pin code" + textField.secureTextEntry = true + } + + alert.addTextFieldWithConfigurationHandler() { textField in + self.addDoneButtonOnKeyboard(textField) + self.pinChanngeTextField4 = textField + textField.keyboardType = UIKeyboardType.NumberPad + textField.placeholder = "New pin code again" + textField.secureTextEntry = true + } + + alert.addAction(SimpleAlert.Action(title: "resend", style: .Default) { action in + + }) + + alert.addAction(SimpleAlert.Action(title: "Confirm", style: .OK) { action in + + verificationCode = (alert.textFields[0] as UITextField).text.toInt() + oldPin = (alert.textFields[1] as UITextField).text.toInt() + newPin = (alert.textFields[2] as UITextField).text.toInt() + newPin2 = (alert.textFields[3] as UITextField).text.toInt() + }) + + alert.addAction(SimpleAlert.Action(title: "⇠", style: .Cancel) { action in + + }) + + self.presentViewController(alert, animated: true, completion: nil) + } + + // add a ui tool bar above each keyboard, and done + func addDoneButtonOnKeyboard(myTextField: UITextField) + { + var doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 50)) + doneToolbar.barStyle = UIBarStyle.Default + + var flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) + var fixedSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) + var done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("doneButtonAction")) + done.tintColor = myTextField.textColor + + var items = NSMutableArray() + + items.addObject(flexSpace) + items.addObject(done) + + doneToolbar.items = items as [AnyObject] + doneToolbar.sizeToFit() + doneToolbar.backgroundColor = UIColor.whiteColor() + + myTextField.inputAccessoryView = doneToolbar + } + + func doneButtonAction() + { + if pinChanngeTextField1.isFirstResponder() { + pinChanngeTextField1.resignFirstResponder() + } else if pinChanngeTextField2.isFirstResponder() { + pinChanngeTextField2.resignFirstResponder() + } else if pinChanngeTextField3.isFirstResponder() { + pinChanngeTextField3.resignFirstResponder() + } else if pinChanngeTextField4.isFirstResponder() { + pinChanngeTextField4.resignFirstResponder() + } + } + + // MARK: - Navigations + @IBAction func unwindToMainViewController(sender: UIButton) { self.dismissViewControllerAnimated(true, completion: nil) } diff --git a/Frameworks/SimpleAlert/AlertController.swift b/Frameworks/SimpleAlert/AlertController.swift index d8ce7f3..7bc8132 100644 --- a/Frameworks/SimpleAlert/AlertController.swift +++ b/Frameworks/SimpleAlert/AlertController.swift @@ -15,6 +15,9 @@ class AlertController: SimpleAlert.Controller { textField.backgroundColor = UIColorFromHex(0x3D4656, alpha: 0.3) textField.layer.borderColor = UIColor.whiteColor().CGColor textField.layer.borderWidth = 0.3 + textField.tintColor = UIColorFromHex(0x3D4656, alpha: 0.9) + textField.font = UIFont(name: "American Typewriter", size: 17) + textField.textColor = UIColorFromHex(0x3D4656, alpha: 0.9) configurationHandler?(textField) } @@ -30,7 +33,7 @@ class AlertController: SimpleAlert.Controller { button.setTitleColor(UIColor.grayColor(), forState: .Normal) case .Cancel: button.titleLabel?.font = UIFont(name: "American Typewriter", size: 19) - button.backgroundColor = UIColorFromHex(0x3D4656, alpha: 0.9) + button.backgroundColor = UIColorFromHex(0x54C799, alpha: 0.65) button.setTitleColor(UIColor.whiteColor(), forState: .Normal) case .Default: button.setTitleColor(UIColor.lightGrayColor(), forState: .Normal) @@ -45,10 +48,13 @@ class AlertController: SimpleAlert.Controller { configContentView = { [weak self] view in if let view = view as? SimpleAlert.ContentView { + view.layer.backgroundColor = UIColorFromHex(0xFFFFFF, alpha: 0.95).CGColor view.titleLabel.textColor = UIColorFromHex(0x3D4656, alpha: 0.9) - view.titleLabel.font = UIFont(name: "American Typewriter", size: 30) - view.messageLabel.textColor = UIColor.lightGrayColor() - view.messageLabel.font = UIFont(name: "American Typewriter", size: 16) + view.titleLabel.font = UIFont(name: "American Typewriter", size: 26) + view.messageLabel.textColor = UIColorFromHex(0x474E5D, alpha: 0.9) + view.messageLabel.font = UIFont(name: "American Typewriter", size: 12) + view.messageLabel.textAlignment = .Left + view.textBackgroundView.layer.backgroundColor = UIColorFromHex(0xFFFFFF, alpha: 0.1).CGColor view.textBackgroundView.layer.cornerRadius = 3.0 view.textBackgroundView.clipsToBounds = true } From 1d77f6316b408de083d4e8c095ea4a8501141e36 Mon Sep 17 00:00:00 2001 From: caoool Date: Tue, 26 May 2015 07:34:13 -0700 Subject: [PATCH 05/17] Phone change added --- Arrived/Main.storyboard | 3 ++ Classes/VCs/UserMenuVC.swift | 95 +++++++++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Arrived/Main.storyboard b/Arrived/Main.storyboard index c4bad3d..b335cf1 100644 --- a/Arrived/Main.storyboard +++ b/Arrived/Main.storyboard @@ -970,6 +970,9 @@ Moderation is conducted through a democratic system known as the Tribunal. In th + + +