From e76bd031fcefd6434b7414b334239495954b8f40 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Wed, 7 May 2014 17:35:20 -0700 Subject: [PATCH] refs #147: basic "locate me" button in debug UI --- ios/MBXViewController.mm | 46 ++++++++++++++++++++++++++++++++------- ios/img/locateUser.png | Bin 0 -> 4924 bytes ios/llmr-app.gyp | 3 ++- 3 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 ios/img/locateUser.png diff --git a/ios/MBXViewController.mm b/ios/MBXViewController.mm index 4d995fc1e..dcd2271dc 100644 --- a/ios/MBXViewController.mm +++ b/ios/MBXViewController.mm @@ -6,12 +6,13 @@ #import #import #import +#import #include #include #include -@interface MBXViewController () +@interface MBXViewController () @property (nonatomic) EAGLContext *context; @property (nonatomic) CGPoint center; @@ -20,6 +21,7 @@ @property (nonatomic) CGFloat quickZoomStart; @property (nonatomic) BOOL debug; @property (nonatomic) UIView *palette; +@property (nonatomic) CLLocationManager *locationManager; @end @@ -62,6 +64,9 @@ MBXViewController *viewController = nullptr; [self setupInteraction]; [self setupDebugUI]; + self.locationManager = [CLLocationManager new]; + self.locationManager.delegate = self; + map->start(); } @@ -117,7 +122,7 @@ MBXViewController *viewController = nullptr; - (void)setupDebugUI { - NSArray *selectorNames = @[ @"unrotate", @"resetPosition", @"toggleDebug", @"toggleRaster" ]; + NSArray *selectorNames = @[ @"unrotate", @"resetPosition", @"toggleDebug", @"toggleRaster", @"locateUser" ]; CGFloat buttonSize = 40; CGFloat bufferSize = 20; CGFloat alpha = 0.75; @@ -216,6 +221,15 @@ MBXViewController *viewController = nullptr; map->toggleRaster(); } +- (void)locateUser +{ + [NSObject cancelPreviousPerformRequestsWithTarget:self.locationManager selector:@selector(stopUpdatingLocation) object:nil]; + + [self.locationManager startUpdatingLocation]; + + [self.locationManager performSelector:@selector(stopUpdatingLocation) withObject:nil afterDelay:5.0]; +} + #pragma mark - Destruction - (void)dealloc @@ -254,10 +268,17 @@ MBXViewController *viewController = nullptr; #pragma mark - UI gestures -- (void)handlePanGesture:(UIPanGestureRecognizer *)pan +- (void)cancelPreviousActions { map->cancelTransitions(); + [self.locationManager stopUpdatingLocation]; +} + +- (void)handlePanGesture:(UIPanGestureRecognizer *)pan +{ + [self cancelPreviousActions]; + if (pan.state == UIGestureRecognizerStateBegan) { self.center = CGPointMake(0, 0); @@ -289,7 +310,7 @@ MBXViewController *viewController = nullptr; - (void)handlePinchGesture:(UIPinchGestureRecognizer *)pinch { - map->cancelTransitions(); + [self cancelPreviousActions]; if (pinch.state == UIGestureRecognizerStateBegan) { @@ -341,7 +362,7 @@ MBXViewController *viewController = nullptr; - (void)handleRotateGesture:(UIRotationGestureRecognizer *)rotate { - map->cancelTransitions(); + [self cancelPreviousActions]; if (rotate.state == UIGestureRecognizerStateBegan) { @@ -369,7 +390,7 @@ MBXViewController *viewController = nullptr; - (void)handleDoubleTapGesture:(UITapGestureRecognizer *)doubleTap { - map->cancelTransitions(); + [self cancelPreviousActions]; if (doubleTap.state == UIGestureRecognizerStateEnded) { @@ -379,7 +400,7 @@ MBXViewController *viewController = nullptr; - (void)handleTwoFingerTapGesture:(UITapGestureRecognizer *)twoFingerTap { - map->cancelTransitions(); + [self cancelPreviousActions]; if (twoFingerTap.state == UIGestureRecognizerStateEnded) { @@ -389,7 +410,7 @@ MBXViewController *viewController = nullptr; - (void)handleQuickZoomGesture:(UILongPressGestureRecognizer *)quickZoom { - map->cancelTransitions(); + [self cancelPreviousActions]; if (quickZoom.state == UIGestureRecognizerStateBegan) { @@ -414,6 +435,15 @@ MBXViewController *viewController = nullptr; return ([validSimultaneousGestures containsObject:[gestureRecognizer class]] && [validSimultaneousGestures containsObject:[otherGestureRecognizer class]]); } +#pragma mark - User location + +- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations +{ + CLLocation *latestLocation = locations.lastObject; + + map->setLonLatZoom(latestLocation.coordinate.longitude, latestLocation.coordinate.latitude, 17, 0.3); +} + class View : public llmr::View { public: View(MBXViewController *controller) : controller(controller) {} diff --git a/ios/img/locateUser.png b/ios/img/locateUser.png new file mode 100644 index 0000000000000000000000000000000000000000..e0599e5425efbc6e56f60824416961d5f239f13c GIT binary patch literal 4924 zcmZuzcRXC%+MZ#;=p)hVm?$BP5+%e;FnSk6%MiUA(T0dVh~9z_C3=ezMDJY)(Mf`c z7M(S)iR<(6k7?TL0uMSjku zp7$Ee&#cx?%~*B&jLXmZu&rf;VgZs?Tz+F*KZ7T9pceJfaLnXwgoFIkiwBH z-uPKFA|<6zv8U=_8}4t>_?fp=lhbwb!Y>XchGHiG5X()7O8RorF5|t>uIi>2x&Xc3 zPvjN~5fq}yBFcUPTkI-#I4D@T-Pr#!nR6+N!C;8KNjM|2QFAVpV<9IJl=bK($5-o| zXM~o`I!dX4<-=QJV@GMK00F8LlfhNaEQc^5IV$??upf8;@QW_-CKvLEV{w}dfM>q- zQaC6~$t<68>ZR@S_dctWy(;ZvGr`+0I@K1Qd#VoaSCd8y(E68SlH`CK297BlciGxIFI+UJPAr>DAmoSVZL(vcYk^A4MD_?u|}2keHgn5$Y6bph3m1X9Zj zZ!~tGfFIWY)pKb-Swb9)Io~!qj0AMRcV;^$^mJNg$qYEFMZBD&Y>OedMu&aYhvL5xBwpSV=^ZH zJI?rXPyo(f5rUtD4_Cyql>${tBd0Hqpx`vnBgoDfFdp#qBS<|^)S2KBNUx2|nS|6| zL5et}T}1#m7hnqx+=WnQOBct|TrW->87#(!-n(!l3nBW}fgQI+jH)cvU4XE*-skp}kR_GY`D(gv|Mo8QCc|p03 z21#DqLA$`X3*Zel=|})e^?~t6<4I zg3v6}mvl5e^oyYekqc%IO()Hi1twmazkH}lyCP}@xf5_4m}fTeHea9X&3z9dQOZ|Q zd|eM8$2>NwNPdeyZMu1niM+Rs{u`6CZyntuAt#YCP%Xt&WTXE^C)on$o@W!!9Mw)B zMZ4>+*)z5lVm~H7miZXgo>s0{B14dUAO%|zl-+?{2f_ee1)t+6JA}0Y3N_qdArP;w zM`qk_qo<{tl$bcx6R4Cz*l8cIbEi}X=qTC2(3}X)X10WW2@3@mIs++VjWYI3s0jx} z{C&+Aw>YUZl$qpYX4J)%>!rM;yij=$$O@gt^^0FNq#J59%lat$@GB(TN&cC<*k77Z z5@(;dk?hT(@nR|&n`{El6OBB`~CQI0$|2AQ!uuhF_{wQ7k^mY)Qe6~uB+#}d}M_gTL; z?-N;aSQ;(gT4q{iSgv~ifS^O*@zI?J^m&m9k&TftKZRH7hZl!Gi$i9`iWy zJWGTnS|tJ#V~SOEF%wi1>BWx48sh?XoOY&mGj^vF@RF$Ef?;gNaJq@`#nM^mdPPIn z)4CJ8U!CiS^#q1gh86~T23>|^;T{qCRHxMb)aBGw;ofQ+Ly~tO!)3$Ocg6yVDcgfO zRvc9k;#s9-TLpY0$lTcyM5%dUmA-Y3dezVkbUfThOuF__tu|IhLxo?T-=th?Ckv^S zS(=&Ks?ciW_rC2T^wZ-A=~wNAS>ai&rWvL=3+6YA<4Q(&atw3s_1rbDc@n;dTr}dW z2uoLrSBmOa)1Drm(|O!5Ts=%`zhc8FTq4rgn_cn6z~GJiwZpLG~75DRGW%g_2_c!nw>_> zoY$S+rcj}XQ;6t&QIN38Fic|nJh@yiPOrQ+{?Kg4Zl?e#feb@NA#b#Jw3PVpADN!x zoqL?j{+!xfJ()Vy0Nn+>A^J|73z7#tBt()35naFL4(eplV4z(l8R5kDy^?r1oa_a49+*omB~4-26toxDCJaD5+}mlgqp1qJiPE zSd(^xCp;{StjzO}i?ACVMa!yX`zH0+WzbYYW9Vu8YR~P}s6F(NHjQ*|qOEHrD6-ST(NtIpYoV9{w=6kI{%9Z`4)Fr0@ z=Ki1kr@kUqB3O6p7LVT{XYC@}_T;6(lVy)S*Q;aE?F|dRS~g-Fp^l0(y94qAQI?GJ zPT_OoTCcS#S{~a}?X2|3)XQisH1iD^kvnudP&;hRT2+GI%@>>ss_dYdf|O^u#B zrm&5%h^ZDTtZY^;w^NuXSkGM#V2DXwX^cI-C&vhb#Jcq4ngq1D>Y#7}lhaW8IIAy^@=wjZZazKJO)jx66Gz|kN%v{q3OSFOWNFMuGTHRCU3<6V*u3Uk zb)K|X8r^cuXY~Yq%0G9|;IkZkkO^qXs#LTGs*k?p%KRh`dtybm_aX(LmBn*5n@03K& ziUzI#0LhK30R*I`(E$K>0=7E(Zu)Af66P33xTyuk%o6VD=zPfr03EmU0vCo0z>vgHC{)tL!b;+Sto&c{ z%P$1X#?8%Hf}bCY#lo?7;20NcenD|@aee_Iejy>gO9r2-my?^RC!dq+%|Da;E03(D ztGSD+)C}Y9hJeAY7W((|SDlW||6a(+^)FYK{`fsjo%sdf0{s6=(@z{>e9ZVCjl+aKCB-QcUPC!Qa7u3iSV%;P2pH0!jX> zp8l=Je{SF(=;aO~i7&nU>og#VVRa~d0D!_>^;_V86DuQ7!v+Qq?Px{g_ zUE|@#7ry9;i3t(+W+P`mte)e;9}4}ipvi-`)l7PDy9rn1Ty`{MO&(?@@>P-CPpsBkGoMJoXffUfBc#ObF^pTq+1!3=w*z zXQ9iV($49c9RWu?eI9)jv1OIs`{b+ZfY^DwkvtA&!B?)otY3HlEfbT-zeB{vS()?3 z#2Lt9Pjfk#xoTIxe=c;utAyJYMa7nDiHq^9x(d>?6;*dd+%;LwdUVDZ#VnO!yGEpV z?x2)jM$Wdvzu9CZER`!t_4rs>MPf8VZOi;%5np`H=$l;HaP>I*k|fWNjHnfbA`d>0 ze1}hDY*cBSvI(*rrPE@CfX6zisPt<3ae_!h(rc~AR8QLTIpz7t-tF8&GDyy0W5vI3d0c z1`<_Ykb}eON>|SCCbd}{8qs~P&$*+@7N#(|2}wiJ1C_q1f&0j7rIFDl=;|0A8DZNs zUZw(8@mOi{gZlXP^r{#L$}sy}Jn^T1755S+5RN0A0Gm5bp_2FS;yLcR{%%) zDV3QmwVH}juOMsu>{s^K+`IHjMT2+M`*aSUA68*hOXfSLHz?WId+XVwVtM!w;0-Uz zg3;0b_pipMuGhRSP6$V%`oH=s!DJJXqT4fm#p>&g?$7HT(}u4|_syfIw)wwW> zLJjVN`Hdh_1{TT7Qn|0$Wc4he13o~P7+LW_5fC*)WgnGJLMt_9)+1O@c=L5LMV0X9 zUnyr~Z+9H1XPSEg6%&#?YuxDBlZ_aVPqZ7Np%PA-jL4)QSgx{4lSdtGwz{^LtD~hO zV@Y>XJ8htv#Z!gnYG8%YZrAn~ic@IRd^M!#8x@1-DGeoX? zjIV-ZZIRdA*B8nw8Z(9)+;!TRrZxI`;YtEN7RIF*YD&GACY`2XX4|Ao7~+@enbahx z&3|K8QBd)Pd?ARIxWAFfMFeL}m!_ce%1)zsRd<~OoB~1zQ=3epzN9^dy z`UR>RZxY;=%#Pqu5ORg0F0^o(DSg*L9iA-Jd6eox&DHxTCaj zuVmOK+GolfvTE!3K_fL=DeF3)YA#;;$~>n>A{{>4Z-1-R1q&`73uQ0X)kn-fWb2Bw z-XG>BVtXnxhjM#Xf*~J!z{7?ds%&a)dyFzI!jU2dBqG00WAI<^AY~NqWh-R|<%8MA zaJw?j^KR~G3~Uw*)-7|cW(^YRYDKs@_4Tv84;gnq*2Y|>DN8spdLGUCIV)WIHjcMP z{1bY%yHmXe7fVDF3SrJv6CHa)#CGEgR`uanX`=G;)bV5TGPQ-Ky=b-Gk3N5RkhHJl zZa3L^D;Vgb%q1%qPDIfXK!5g&B?0)WW|ZjdvEYY|mxEsJ8FJj|5SDW^$NLQgTE6gL zlxXe8&P~}~(`)kN1Mnc%iji&t5v<#B@@84tP!T-H{dC#5e5g|O_c=Kia_|FXLVNwp zr(PDh=WDZb1#x9Mt;mKvj0tF$F**v8w3tkz?RPvsR`$I_O#Wi@ro}q~*_OGVG5Ko6 zJ~#by{Cs&hIjPTdC)`_l_w&m4!M2@iXxUz@BboU42N+v_rq`0xGabg*_(=_+@$7du zwaA{(IZVRXBdl4-C8NA)yFeH1dR4m@Ar==(v7T1w{rv)HYkbo zL^~FRYtSuY*JqnYZ^{BsII|b6-?0t!fuRhO!Z4hPSbRJ&F!pVOd>>cQX6%#OAgP{W z2DU@6KnfJ_phiYD^Y#0#2ZAUF1Ox&~OI?O=)K|Pzfx=s)qLkmRt|Urw>at}rj|2Y? DZv^vX literal 0 HcmV?d00001 diff --git a/ios/llmr-app.gyp b/ios/llmr-app.gyp index 6ae1240e2..e40ffe9a1 100644 --- a/ios/llmr-app.gyp +++ b/ios/llmr-app.gyp @@ -27,7 +27,8 @@ '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', '$(SDKROOT)/System/Library/Frameworks/OpenGLES.framework', '$(SDKROOT)/System/Library/Frameworks/GLKit.framework', - '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework' + '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework', + '$(SDKROOT)/System/Library/Frameworks/CoreLocation.framework' ], }, 'xcode_settings': {