From 873bae2eed446d00fa12169cac739c7729e3af28 Mon Sep 17 00:00:00 2001 From: Michal Ziman Date: Mon, 22 Aug 2016 19:44:29 +0200 Subject: [PATCH] [ASMapNode] Add custom pin annotation for static maps (#1890) * Adds possibility to have custom annotation pins on static map. This resolves #1889. * Removes wrong example for map annotations and adds some annotations to correct map example. #1889 * Static map node now uses specific property block to get annotation views. * Changes self to strongSelf inside of the snapshotters completion block. * MapNode: Adds statement in documentation. * MapNode: Block for annotation view/image now returns UIImage and center offset is returned in inout param. * MapNode and map example: Fixes from review. * MapNode example: Gets image directly from custom annotation, without creating annotation view. --- AsyncDisplayKit/ASMapNode.h | 6 ++ AsyncDisplayKit/ASMapNode.mm | 41 ++++++++++-- .../Sample.xcodeproj/project.pbxproj | 8 ++- .../Sample/Assets.xcassets/Contents.json | 6 ++ .../Hill.imageset/Contents.json | 23 +++++++ .../Assets.xcassets/Hill.imageset/hill.png | Bin 0 -> 2959 bytes .../Assets.xcassets/Hill.imageset/hill@2x.png | Bin 0 -> 6094 bytes .../Assets.xcassets/Hill.imageset/hill@3x.png | Bin 0 -> 11050 bytes .../Water.imageset/Contents.json | 23 +++++++ .../Assets.xcassets/Water.imageset/water.png | Bin 0 -> 3256 bytes .../Water.imageset/water@2x.png | Bin 0 -> 7347 bytes .../Water.imageset/water@3x.png | Bin 0 -> 13644 bytes .../ASMapNode/Sample/CustomMapAnnotation.h | 28 ++++++++ .../ASMapNode/Sample/CustomMapAnnotation.m | 22 +++++++ examples/ASMapNode/Sample/MapHandlerNode.m | 61 ++++++++++++++++++ 15 files changed, 212 insertions(+), 6 deletions(-) create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Contents.json create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/Contents.json create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill.png create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill@2x.png create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill@3x.png create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/Contents.json create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water.png create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@2x.png create mode 100644 examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@3x.png create mode 100644 examples/ASMapNode/Sample/CustomMapAnnotation.h create mode 100644 examples/ASMapNode/Sample/CustomMapAnnotation.m diff --git a/AsyncDisplayKit/ASMapNode.h b/AsyncDisplayKit/ASMapNode.h index 5af8547ae5..1d9b96c7be 100644 --- a/AsyncDisplayKit/ASMapNode.h +++ b/AsyncDisplayKit/ASMapNode.h @@ -70,6 +70,12 @@ typedef NS_OPTIONS(NSUInteger, ASMapNodeShowAnnotationsOptions) */ @property (nonatomic, assign) ASMapNodeShowAnnotationsOptions showAnnotationsOptions; +/** + * @abstract The block which should return annotation image for static map based on provided annotation. + * @discussion This block is executed on an arbitrary serial queue. If this block is nil, standard pin is used. + */ +@property (nonatomic, copy, nullable) UIImage * _Nullable (^imageForStaticMapAnnotationBlock)(id annotation, CGPoint *centerOffset); + @end NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/ASMapNode.mm b/AsyncDisplayKit/ASMapNode.mm index a7d8aa6d80..7c64abef9a 100644 --- a/AsyncDisplayKit/ASMapNode.mm +++ b/AsyncDisplayKit/ASMapNode.mm @@ -167,6 +167,14 @@ self.options = options; } +- (void)setMapDelegate:(id)mapDelegate { + _mapDelegate = mapDelegate; + + if (_mapView) { + _mapView.delegate = mapDelegate; + } +} + #pragma mark - Snapshotter - (void)takeSnapshot @@ -209,15 +217,27 @@ UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale); [image drawAtPoint:CGPointZero]; - // Get a standard annotation view pin. Future implementations should use a custom annotation image property. - MKAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:@""]; - UIImage *pinImage = pin.image; - CGSize pinSize = pin.bounds.size; + UIImage *pinImage; + CGPoint pinCenterOffset = CGPointZero; + + // Get a standard annotation view pin if there is no custom annotation block. + if (!strongSelf.imageForStaticMapAnnotationBlock) { + pinImage = [strongSelf.class defaultPinImageWithCenterOffset:&pinCenterOffset]; + } for (id annotation in annotations) { + if (strongSelf.imageForStaticMapAnnotationBlock) { + // Get custom annotation image from custom annotation block. + pinImage = strongSelf.imageForStaticMapAnnotationBlock(annotation, &pinCenterOffset); + if (!pinImage) { + // just for case block returned nil, which can happen + pinImage = [strongSelf.class defaultPinImageWithCenterOffset:&pinCenterOffset]; + } + } + CGPoint point = [snapshot pointForCoordinate:annotation.coordinate]; if (CGRectContainsPoint(finalImageRect, point)) { - CGPoint pinCenterOffset = pin.centerOffset; + CGSize pinSize = pinImage.size; point.x -= pinSize.width / 2.0; point.y -= pinSize.height / 2.0; point.x += pinCenterOffset.x; @@ -235,6 +255,17 @@ }]; } ++ (UIImage *)defaultPinImageWithCenterOffset:(CGPoint *)centerOffset +{ + static MKAnnotationView *pin; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:@""]; + }); + *centerOffset = pin.centerOffset; + return pin.image; +} + - (void)setUpSnapshotter { _snapshotter = [[MKMapSnapshotter alloc] initWithOptions:self.options]; diff --git a/examples/ASMapNode/Sample.xcodeproj/project.pbxproj b/examples/ASMapNode/Sample.xcodeproj/project.pbxproj index b7da6bb298..1bc3e8c8b3 100644 --- a/examples/ASMapNode/Sample.xcodeproj/project.pbxproj +++ b/examples/ASMapNode/Sample.xcodeproj/project.pbxproj @@ -14,13 +14,14 @@ 694993D81C8B334F00491CA5 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 694993D71C8B334F00491CA5 /* ViewController.m */; }; 694993DD1C8B334F00491CA5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 694993DC1C8B334F00491CA5 /* Assets.xcassets */; }; 694993E01C8B334F00491CA5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 694993DE1C8B334F00491CA5 /* LaunchScreen.storyboard */; }; + 905C815E1D362E9400EA2625 /* CustomMapAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 905C815D1D362E9400EA2625 /* CustomMapAnnotation.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 15AD337503831C4D33FF8B3A /* Pods-Sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.debug.xcconfig"; sourceTree = ""; }; 465082D55CCF1B0CB1AEBACC /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5E5E62821D13F39400D81E38 /* MapHandlerNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapHandlerNode.h; sourceTree = ""; }; - 5E5E62831D13F39400D81E38 /* MapHandlerNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapHandlerNode.m; sourceTree = ""; }; + 5E5E62831D13F39400D81E38 /* MapHandlerNode.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = MapHandlerNode.m; sourceTree = ""; tabWidth = 2; }; 694993CD1C8B334F00491CA5 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 694993D11C8B334F00491CA5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 694993D31C8B334F00491CA5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -30,6 +31,8 @@ 694993DC1C8B334F00491CA5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 694993DF1C8B334F00491CA5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 694993E11C8B334F00491CA5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 905C815C1D362E9400EA2625 /* CustomMapAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomMapAnnotation.h; sourceTree = ""; }; + 905C815D1D362E9400EA2625 /* CustomMapAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomMapAnnotation.m; sourceTree = ""; }; 97482F27BE2F7583EFE1BC2C /* Pods-Sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.release.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -89,6 +92,8 @@ 694993D71C8B334F00491CA5 /* ViewController.m */, 5E5E62821D13F39400D81E38 /* MapHandlerNode.h */, 5E5E62831D13F39400D81E38 /* MapHandlerNode.m */, + 905C815C1D362E9400EA2625 /* CustomMapAnnotation.h */, + 905C815D1D362E9400EA2625 /* CustomMapAnnotation.m */, 694993DC1C8B334F00491CA5 /* Assets.xcassets */, 694993D01C8B334F00491CA5 /* Supporting Files */, ); @@ -229,6 +234,7 @@ 694993D81C8B334F00491CA5 /* ViewController.m in Sources */, 694993D51C8B334F00491CA5 /* AppDelegate.m in Sources */, 694993D21C8B334F00491CA5 /* main.m in Sources */, + 905C815E1D362E9400EA2625 /* CustomMapAnnotation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Contents.json b/examples/ASMapNode/Sample/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..da4a164c91 --- /dev/null +++ b/examples/ASMapNode/Sample/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/Contents.json b/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/Contents.json new file mode 100644 index 0000000000..273884cba6 --- /dev/null +++ b/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "hill.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "hill@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "hill@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill.png b/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill.png new file mode 100644 index 0000000000000000000000000000000000000000..8998668eb084abc2ce7c8a27caf1693bd8f95efe GIT binary patch literal 2959 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 H+eQ8hbdOZ} literal 0 HcmV?d00001 diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill@3x.png b/examples/ASMapNode/Sample/Assets.xcassets/Hill.imageset/hill@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..761c66684a66ce9d33a3a8fbe27f4505a3427f14 GIT binary patch literal 11050 zcmY+qb99|S*EW7)tFdj{c4J#7jh&p>X&N+YY&W*i6RWY^p4fKduYI2P_x`?b)*9`( z_O)lvAG6kdUlXmaDvyRtgbV-x&=eJ9H2?NN|0*K<-*%h2B>)CpuAYX z{hd=-Drl+z0Dg1;Ku9LhS6`-rj89+-xrHHtd{&f`aTETnifk zDx~IaXZ1JoKYlSzk^dn7AKU-L5n=xq{Qug_e>44$^>3@Z3iyEUJrQWbu<%Y#&#@eiq^64y0-0 zVZ)!-(kOv&GM1;+^Sl4WuVuma$Da51>EJxQDrtJ#mWD-Lqt0f-!t0OB9u!9&OUB~V zxX)+59N7e?^)q*ja|M?&UK~quGUbG|;zkEqNfSmU8Rtn;qi+I@WRn%UI+l4Wf@+Et zYfig9M*1})T{LRnqSX*}QajJz>x15iT}=IM@?hp+aSeahN*(X&7UOvfwg+RHAarRV z;DbnKIJl7LEGpKqTh~fRQq`R=FN=7mBYseCIn3V@?=(wyO{_GM zmvFSo-gR*o)7F)wpEYD;iWqJ#+pi(Sso>!HBQO3ANrbR{>w}WhS^*TFMUv}8?s5y* z!R6_j<;7!$r6#$T$~6f4$fYmh*}&=#4WCNa=Pb*cmT7sdorUmbT`j1llY`$}a%Y~Q zwHguW(2N#1RPe10S26veal*NoMWEV>Wla_K^~%SJDB-(N#;Gu~u7;O1({38dP<}jP z-~uf%rniK=tH*Z29b5qPQyak1kSU9`AlK)FdiJ-Li_>Jg3#;1#WJs<|&C}9f(pxT* z#I-k~*USfUeYdp90MJbnj}wq3;Az3f>f|Ah<#y~>z{=Ltuqr9t0>0?1libah^F9~i z9eAjDd4pztaoDzyJ+6g6#IU4!J8a*la+Vr`=*_2aTdB_S7CRh+G(896yYB?$dzxkj zAut=E?4e#V*@d%wp%G%5{<5l-va^U+->mSkrJvB@!tna=DC?y#!|;AN`9hZFFC3;w zd%A5NG1}1Ow6@J+gui?e4yg*=KjQ0pXl3L(?EzbF7b=M345?o zGpU3&&*4$SJMgI*WIN&+zj`O{d}EZR2<4iN7m_vENQ6qn&uyyHDurl^Wc=AU9E2)( zoP8FtnB!kO1zx-`aocE0B5DcNgXT@U;(gyi34k`tyQB#i&T_DMkj?Mrtn)TK8s3N^ z)(6!i)pnq@tx|4As&VjDha^V=WMlwO8~L#r9o~ay9^Fj`jTh%hv3OV3B3xo(y;|e= zG>0`xvdoajXHtW%KpnBx9f9P@x$ng|ZCl?3s|84h`%0w`3lO6Y6=c3>UTlzg9RzYO zUJX9b&Yx_NJAUkauIsvACi6+#3likJnPSgrXTLq&*ex;=bGS8K`q_)fh`)8Fnvu^v z6(*M^y>OHxr$NjyuMOJVMaa&P<-cWl7p{X>A8azj(lgpL2zs=7Oqse_*F3(<&M95C zuB2%im~iM}(ycmO^Z-*`Vg?+F6D6FzVfz=^zoCuZkDTLG#`x&P7%#y8DY9R)J8^MX zOY8RcD!-$>7eV1+iSBPxEa<(LpW2+vqLiSS7Hp(@XuM(LaqxQ%G{-UJi ziC8NWY2c%aaf{MP&d{(fkGX2r{oK{HN-$)sqwv9ze(s@SSS`QC9Rnm@(b+jWg>mUy z&7qARfOQz>Anxu#cR!~0n zL$u40^Iy1v#0$5fr8c^iAoyHt+q@i>>8dYa@&tjvw6C(B()P2*w~b}B>BO=GDcPGV zIl{WD0rG6EwVpb3-F77(3x%CN+`2!SZQr;)HOEQH6QU|73yzNC zW};M_^(T*V{MZgd;zqOI)mUVSN+E! zgYWxk?N0c`F)vI=1XGSoQM6WNQsl3(o|-Rp$6j)(HZLXrk|T8t z@`8McF51YOWZ9gYp1MEJju0)PZzS$)epZ}upiL)pne{seAN9D-BfvyC!l2}{3ZDzL zNx%{^Ub%;q zn$Aq%MO3NGpo^uHKYUo$X?6+gq6enc#WnU*7p&Do+rzAsZ+t^`))fZ8!{ zlRhworj5#fJOKEjLxdeSLz~(V#@?S)1{LH4v6?jcfA-Eh{;}MBIy?A;`DHmjp7V2F zTs~|d4*c?ED@Hdl9UaML|Ex+987J}3ZUU-^`~Ve?ciu*#ozEFJA@@?fW0n5ne3 zQY_KmLopB2P$8KczKXrBP5AA4g^B^b81mpb4S_s)7OyH$TMk78+q7%b)h%bhkW7Y; z1`~`#NmiTDTNnF2N~gogb;4Uo$RF-S{-g z98JopJ?I|g%5e!oeo1T~{NYbaFYL1e;UofS{*E-a_-z~p1fmPSX^8xbHt%7Ki8p7fm z;QN;ZDsn^w{^L`O0I9+!x=g){grK-}@OYA)$`_#@_|scW^zF6ClpCC0iWdWEcot=g(}Wx>{_5iF?)7cY#xiRNrd_a5N|N-Dgrp>a2Ua5SeG`3g})L0V)NBhWH9&x2xhXCBkqL$(!Zx@ZDBl*W^>Aqcm89Q zgWDUfh{b1S*nHj18N>__a?P|yr*G@K_qgOOyHzR{hUKWW z=MWtA3Gx<#G?Wh;Pxy>Wr??BzhI6Pl;#vCR5jfy5vY#T6gh#X*e!Xb7e z-Bna&zB2FKMSh(hhRg|dM8o0i@X3g8!CDt#C}*2y{HM^uWi#B2g;SX@*X`k`^&rqi z=8uP8OHA4xlM=AdYS`>aId0ypoSYLz_%?EBFFV|kUIk=YVT=Gyg_{sV1Oh$9(ss;H zdIISKPC#(xT3D)+E&dZ!AV7?_a;gs@qW43_aqRQ`hfx|mIJo^Z7VIo_Hhhd-A@|1b z85xfQrM_vKyHK5RZxJI6n!khb;nlNWafNmR+D({Qpy9qtdlvfWQ$9^?hq?Jl@&3y8 zbT#1sMKe}<#Y8tCGN(nfETply9p76FDHJD{`B|GTC1fk~Bk9)be3U2K8ukO} zMM2!nsaiTxBx?4z!%@$U^8s)9D5s4}dmKYDj92mN-1;)e`*|zwI_ipe8Agp198-sHB}RS)7^! zl(SbSdv9F+Y}z9OV69(V00VLeEwCh|1FiVFL!4F zUjrik)t)SnW=<3WMlL5hL+pfAxQmV+O+DU~@cH;-pr0B5_%iANXuk-G{mUYUeecHg!Q>Nyz zSD2k7^?LZe)a!)MvL1pV`La%&{zn3a92AsqH=4L-12|dmlF{9H$9=wsfEb zUFfHI5(8sH-1{7MtUAG<`cwL~G`$~A89A~u6*_%hP@ry=S6(u(1_)9WhAvM&S*t5w z*u@nymBzQQOn8_|KS(ofHzXXU*0fP;3Pq_G)=vUEd2^c?6bSc?A!A?pI|iPsIprw! zrU@^Au^{)LsB_?|nXcn%Z31BdFLwR4^?N`No>|kVI_y z5KQd1HgoIgENm>;+#Zc!hBBil80|-^&#C38XNWoI$#Dzpc779H(+Edq3 zQ*ZT0TNu+dg(1vi~H>`v-4~^guGeA7G;lp<}J-? z?C$K>c_!fvucwoY(=#T36cu$}JhF6x(c2vs%szMc_uBg)cGq7j7F#PA2e`mM*n-TQ z7hFexUvw)}UeS$>BaThjS%{wRMCCyuc7g)gy*l+nYmYqXN0zL`9!-G|+>C(Bn8hDb z@by@;#K)IKYh`cwGGw;53XF*zELsL}T*p6xj*cH`&Dpswu~x#0X}@NM1cG5$@s1p{ zdSC;YH+uvGs>;ww>!WJ69#=ys#FI&|i;W!Qut24M>pt=YW-?TG|0} zIr(;l`<#oGj{*!)HsFdYo*Pj2o9wlBFX9Z=jk3+xIC>Vf)vOWCk84NjAWE%2J&1n2*3ty>l z3}6)E7rfD$J;~*QxnO_iJ&THMN00P+-C^@6)g$l0Aw%^Tr%RPh$V5m8NWx?l)WL{8 zEXqd4Z-_;*yAQJlIpAi&aQ508wqPhLj(vLZ!3;De_ViV>aBo^4L3(ppcNmF_qkO0map0et7_8}0U z<_#Ylu+{*7s0A-I6N}VumNZh~3u2^aYVJSgs3Sc-s8?Oyjs>|(gxlPY0I!(FP%^N1 z<>^J!cv4)P$CZA09A9Uo?-$vn77}?n1)1h-ae0ylq?3Q$`8h^)@M>@jjIDSD|FZc! zB?AXdtj~vf!WaL<&3G1fI#R}vw9Q7fO|HTHRP+7rSXkLqti(ikSiKxfXV_ZiUGA({ z`IpiVwKapX_xlT6^PAH~3i?a|^jVz*NoiCuKh~n~D1+B`ZiOC`S6Vy<@OXaV0KI(; z=o4%#npirzD(&6ADawYqTG7G?T7Y<$S71j1ZR(kn+QNk9}tSdWiI!a^msa)F*#@EU6zx z6b1#M84hel=s^V38(!p-01(JY>J=}xfZW6^_$3&1;^Ipw23xPXqS(EE`kG8l zkJO#yNsr=580^vEUV)CsrDq%Q-Xm;YcKNZ11P3b)E2QMuiK7gr`J61@o=o#|3<|z2 zJ9;4*6|`qH?lsR19#?v3X0XJy*gF3(6m_L1i-5X#MDa3GubtJO3LsJQc;Q_SyPoqy zK$tzPaH&t2J%sBHS|C`^b|QpnZHUNTOp|Jfu6blm2t1zscGf3es*L*n0sDFatlJ}* zmX|0GqZaVzVc08DOnURs;MjV?JrDu+Cj%$|Acff%GL`zlZDyRmRlD*5ugbSM$ks2y z+)u03VZ9J$#V$bl2g`W4x2@hV_cqn-_chOt$HKq}!AGRnwGfy6s+|QiI4GmzpUSna zg)t*S8C>;~g;^rd&#USQOTr*B{Yp24w23HZ zJwXF}KzBWbwn~H#3JTg!V0j)t`K>Xhe+$wVNQ2m28%M$PpLkQEwdvDf!fpwa@PR6% zg@}kb%aYXVDqjNAH!J1oCwhH)pu}dC&I^@T=%TKm>aELZE7eo^nb1bYFb_2>!N4(m zYaaIts!k35o}N1TxMG|a==M;gux`Wq)_C^^);(S1E8!)7ZCc8zx7chv84_ieBv$GO z<}43UW)-Bc*aTR8Gu!OM@6-ldHE=0N^(ebI_vyvYE@-fnwo7fb;K*0ay_yVY`R?;+ z4D7p!4E@0I>D3f4wK?M%wq#awu1zmRARrTC?YS+zdDNs^w0T;xz_*}yc&fwaTo+Qp z1L>W(h%K=`Z-#)6??u-JO{IVELCZC9YQw8s^1N?y1$JmRk#ZX! zcD^!mT$9esQ$Re7N#ibre^Jjrci_6h*) zhmh+P^grb9T}7XEF_)(I)LjQAj4x;vTxl|>ivLl#{CiPSq#$$)y$EtzouDmyQ!nK` zluOaQfu~fr1eH<5KdFI-N&c{nFK|TdOGJ;*(g|@Ox#7LSqJ?-M>k?>x zcS9|FymkQM+FCPG++l&;{CDxoY#8q%>tS9QzDiRhkZSG$KOewp1b$W!pQEY1=_D zc$;d9&%?DJTxbCMk?x5;o_I>*=d^COp}(A29<~oI{r#VxpYwXmCpL%_^wd!`HMUy$ z$hg-+RzTDIr(d6U;Uro~GR)Yb`9ow0j}!(CSm@wWk(r59>b@?)l-NoLLBVw2Z(-8t zmuMQ9t!jMv>2cqJ@C?7Ob8EE?Q4S?7C36OSXe}02;Lux~K6gUe^?Hp{+nypb?;`P2 zY*7bvyuYV+ah_E0jT&v99qy1G6ysYJY!hz5oaLM4U2tC$`y-GQ8>uhXVaDbi$~b$) z!VqB}^ghg{_B^gf!Bpf_63^Ajy?^-N_b^d72l~k*w&^4 z6Y@0%7@WvG_es>7A8Ql@jw{2ncz2F#Z_l0Bcd12Du4JhJ!#p2x*rE}IlUyutvqXfX za7dEKa_n+&Ka-0HL*y|KM=`x_Xniq^3Gv`D%sFcV;nx!iUQg+hA9t=vyrD8eWjD=d z0SXX|uSsOSb1>X}#8$BO{`t)d@&(dn(6DBBv!H@AO+6-FHuI4qY>pc*zrUY|kZ0hs zn5xxf!+ppyQf6l3T^I^iL(9SMgYq+!I7I}y5>zDYs3Qs0&**_9G|s~chSLFo1L*}^ zd*us`@t4M-Z?X)FyhJV+8fB6=Mz37SbzF7Et66bEX1o{{H8r$8@m2PxAq)s>icoAu z*q6gZfYqpv-{U5ACN~GQXE@Q+Rg;T#S#5!t@f)mv8V9vkHmo0=3XN?j4!<;-u%*@) zmkc2?XK>whlRLd`!{xMu*Tv9&hns=PYhY=I{pP5y;s@!<1U=k2`v@;pr}N_2A}gVh z!D!44NVoUBP}9k>>DEz7PT3ZB6i>y{-@oAMT-S6HM6C z(LkQ#VGp*zFVKu-uAub}bCL*3d~@gM-9bH!Lm^!MIDH&f<$IFMq8AXmS1U3=N@>ym zXR-eLRG90^CaoAhcTNKny+iak{?m`2c!V8D!~6EAy@y11HHP96z1zpqm{x3>AhNLu z2|$;z|B?T)Ek67LU(O3=x>+wF9<*-RPM_=_QS4w)9RSD@$0SnHN`16$VGq>JH5#>=mFmyS%_Zm*8F3SJZ zq+>VxEWU+198O&_MJp$DHi@?IG}VJ*8HFS0#Z1Fg3<~>+>Vp;k84Jndh+{mjR`D$6 zuk;`vMDq1x>(HVv1&lOVXPmdax4!X6g9Thg`#bA#Ro~5GQ7zkQz1sj(b@(pLl zmr&0g>}Ldavh&X>M02~8rWHH{#DN#8KUJqD2( zqN<;JU!5K4>F5O~kd0wSffb*y^f3bB%MvQZC5EmrG6vftL(UdByqxhSo?U&fYCU*S zpa%jta3*SV(3?=UZ)MhRNYR6M3XV2~Q%x-<6xK%_aL&Af$6ue*LzB<79) z=K3FK_WV`NrVmJ-Sy45c`(PhU1CGLd*Cy2b8`xvBx9c^_x4f+0p zR~&ai{?DI7)ix=Gq!8o&%80txD>T*ty$d_pa;XabXX761^77|oRi?EANYf9XqP$84K2i`Qr(*YZw{ITF7uYPi^NXzj1+5rVNEsCgF)fbxBFC2m$YjBoH zz=FyIhC81ly=i3z2sL~*2N7l|LN?=n&!TMSis;6`%vc|@aX|5HO+;fL9>)G2ac&Qn zgU?fyEJ`J7&)UxM{QNr@n6Pyqm@2CX{3@M=B_>X2KLvG7Mxg%(5Q>bQ&G^^^E-{N* z#Y8vZl%>vo+Enb3b@_Pk==3^!u+*_Cs^C`de1VNABH~Mefc{5BK9}^2S@%<#{a8+i zquH~iH$qKa@hnHgRN8vr^%&9(4NU?20@3-rB$(^e)^+6!^n)~J>L?aII% zJdJacxCFWPtc%?rBF~U`lz`I#{}UuD4uVftgn9ig0o~N(jl_;T0vsiyH)8_owlUL% z2ds|59xBSLFQARaNHR8j&GdrKO2`yB~S)rt~-Lx6eSAJ?K^OdrB^(BbiZW zxm>Zg)j(U-`tVncQw?)Y6WG}MZq!|Y0W=Fnf_HMnEFc!1?y{qJ`*p{ZE6Gm>@0_y! zg?LcVmm~s4({s3J9<7tI<8mMLtOdcjphAuCbz2$Va|po1m3$!fR#2en*wkGl_(IXJ zkvAtuSUCWd;eCx$AfHtBTL@9e_ktOsKbIJv(Ew(+0D1be`U?nQfbVQ~%BJkRfTJF9 z$^D0_LIDtHX3O~ZsNmTt#Y_m|P2S7qaVYw2JEy|9v7YRh4&fzD5#q}Wj4+uC_|g$| zO{s)E z(LYHEr(P4iaLxl_A=8P@rz7c5gYq~5mg6i&yUJ5M8Bw{y!-Lo4?Lw<>^Vu}DOrcZl z!{@)yQmd$JiV5#tn%A0_qMfosE08#z`FhzsenHgjNS2ldqX*29L7m@KSLP4d+QD@@ z7E?zfBZ(+eAYOfSlTAepDyR_b7w^^n<+41ZY?q)r$NBuS#RsFuvD!dw>N-yn1d9+m zd1``n$SUf3_0;h;FZl=<`IR)%iwJoO^$npn=bV_E&Fjt%YfGSqW5?Y)W)tP_ z1Iu|(-CwAz-8mu=a!`w0S6b}1q%#vwUxZig-^S*uo=aro(X1`Y%M$2tTA;)f7F{5F zb|fa9ge_-uWp*dZ1_zq(F2J#VEa3>XG56-r<~}s=8Y{2#cY_N^{HXVhxL0iEHoOTO z)V!!9Pdg9Cw6i6`tih0u#5WAl0_u4V4^+Z5ID$*3pG-f9cqcS)i}0G_MJ&x}e0sMu z(E<-d1X$m%JP;)5r{xIvbl|9lqjy*y@M(C;Y!VOmr{3o{3)+H3$xrfZ8q2Rny^9@f z-?z?RqHp$H5u4*TV}4fb{2-pV+8`le8-ij#Rby{(X!!tDUQ;3dt+D9%XDsjX)On0p zprz>rc+Sa>+PS`yM|W09TN%#FZ8H@WFJ>DGR zvFPoM)F%rjOhAogzns8o3HItoS6md%_{JdZg-{R$# ziXhqId-g~^d6>H_;CCVG{1W%A4@V6LD#s%dx0G`^jTyAqMa_UtY`bqyML>+(-w&&= zH_%_LQ!VKcypVg-)n}(t{pkAZd3!9&6vivfKSy9w(N3dUTDG*I zY{=D$YRcVnNPJU3+%WVB3mUEd%Gdf2{fY$sQcfb0O@?00y!=DNUG+2dIj6T9y!$u# zx~vHHDfjI$*e}s=Vn3Ug51Td+zFK>-W#?xXr?hq#!`)q2=j?NTS6`j`1w*dX=ZuUH3i@@pYAFbQ*_yX7lg_PDg zlYZX}pWY{trah}eoeYa~8WW4!*FJ(1&vAStr0QJgLc^e)i_|uw0FgKr1 zQD5LV28lMwKI-I+kw|oix03SC85IwfMV`EmeyOiUQ>y25iAIsOC*6pZrQ(;XDJI{h z(ll24sitlDvx(LLgNDY;vbbc-WfA{Ua$g_Tu^o0|t@m!DVBb_=f9k{#(qi`Sx!7yQ zPO125W%s-a%_5L0&yos9^y%%5ebt*y`S?FvpV$W?=5kNM5v z`U6geiNTCc?ZXt(Pvaw_17MdiG2RKGC~jY6fmXdwK{fS=JVE(yV~_nLv|BBB>RV^k zmu|68_Wc+|{bORJ#vIGna^DYlHNJdc+Uv7Nxre+&{?RYBs(BWmeVXcij*)P#!~Ndt zIy`YPdD@}Ajr!|s`VV=oKCj7uv|4H_OV`hLOKeLFV?z|!8Z1yt^;%Uc4g%dc?m%{# zyIZsAfw102J{Hqti5OWdgH(yfT!Qb5Jw|$wPYB(;Y;n30Movd_T29 zupO=)?OnEq8;iHO0UA)rJhO0k;UF4XdjkMk^GB0KxEKA$p`Ztk!IH41CJ0A@yCTks z;NYz2=T1CS0{|L+h{L11GYKc@=kDg=jqpQ)|5P9j&qrn`Sn^K^={^#SH8qpeA$U1U zswgTeDuGd)l9G}dUQR9ub6x$v-4Aa_@Ldv#h=4-LWU?apk|M#&6$(>RQ-dnOp>Vju zp+dpi--CqnQ}FPX{wv5oade%%9lh{G5}x28c@!7tK=2_U!Qi7r{~mwW=}!E2A`kDs zsSf#|emEi&rlD&zk2(p^{}}p&cjUq zJQRvkw8sJq0B}Yc>1t!J9K#v@u@+Y1Z(6?fX7SXTZ5KtOF0GFK~7?a|cwiwMDJ>&aUD z9JtbWiQsZpM?_}(a>MFWAamy+WO`$q+29IpveehQ4c7GBkh=&EFP?3SF3Lj?E;ZwTcY%ga&9{UEt^BNdvz=-1AAHvv3-tA?-A zf{absmbzRD#hh{mnL(DkzU8!SyOT@y`NtDq&!AZkEQG`=d43d?G1wBGuHQ~%Ar}-< zr&ZB-&z1LgZRO|(LQf_0;t5g(s`6Y64|A=e-k+&2`z_)tuYrH8nA`7BgsEdI%(*Q% z|CN2tFcZ^6N^e=kQG#5RmEm#@jYc2rL7rA#_DI0?NAsi0qCH0mPuWKMNOc_4o)h z{*cCWDp6mM6V;hKKoAevR2!`xC&H+CW#!%Q({!rOYu!dy*{mL|1Nr`a-prLF%nd8N z;0fzHS&06O9<%=%3>IL{q=LsH3~YIP<5~^;MR~3emqadsGN77`=XdPnOm&RqW9@F< z-k8ySDn!0f+Y{&&@c46ar)a;QwQj#~ceq~qt1rhhtTvP$_J}|K70)^jhlJNsVXv%! zbpAZw`3dRZpzJ!o8q$F-zHQj#*z{-IT_kiF0XdlWS?HVM#uz7kaxbYW$d4LfH8}lt z<7ID8#g?cAQoEditamw96WN@E{jDekbOw?Y*QWUTdy1^tXEP!rDUGYHb#1m`Ah?z; z43HO3m%ZDHSxDk45+NIJL5-s5K?=Lq!5<={E~2m&YIGx8>57;rtNFSt{(9W9Wp*{! zF~f_SIG6oN^`eavdu-#h&>U)oq(Zu&Qo@i!YsNtDP5PAKt})*eA&4q{@ow4X_d7** za+4tfoUT;<@BEF*+idptm^mNHOC3yuLQ8IeJ|zqO;Y^R0oMYG zjqV*QcP#XMpd5Ux5@c-2J}oo5KOTLKry$6xb~7M`#94LH@!ckD01Z(--kfarQF?Nn z9nbca=d>PLA9V8q9C_O&dn;rhOgPY#hJG7?i}$x>=9`N}WUS^SHK#Pc$WD3QB2{6q z^RY12b5t;CnD8jK;YNU;)Nj=@srnz+V&%gd-7APODXyRlxy7Lz>jAu-6e(#%35{UB zgJ6vE4$g6C?ITT0hT~Vn2UeeOEA1s1hmOl1&=$=QYHcpCYQ%kpGF5a*CYk54NlQs+ z2LvzfxJcWZcHHsYlwg;QUoyZ|adpySL%BDY?OU{kxMrnM%ZhMs2}`dUq>4^vAh!ho zP%`4%27KYs*3<`7#wK(rw4`RjEiyMykQntcmYb1h-rx<=hR}w~zkcCerbK;IPGU?Y z;FMOhx(Bgr&)IerVG`$w)sV!9&jOd(wv*CLpO;hjL z&c~+LyjmYxxpj$aJ(a#N5 zCc3`kk6uD(_?+b0ItGJ)!dK}m4PxKhwMK$h1?x|USmN~VBuvN#&p_bmOXP1SCYD&a z%5>VqLYAkH58Ai&XSQjZ=TPg+0hb;qZeM4x$a$l<+V`|_dtSJo%lUJnce!rZe`pMf z>>4d_|ACv=42>|S=0`I|l&RKx7xd22oZn2X`Wp3}bz!wsX7F8Tmi7iFO%N%^KWWMg zf-#hp!0|sE2VBn(I_9pYT}=Oq@O~)K-4mcLF z9D*>%yExqADy_=PXya53_bU^BbycWmtJX1KKy)GIo8gPuVj+;nN=UBA1XHB{8(iResP zdP#4#dh!jp7HMQ8@UoIwQCKqpncUEDe~@xn?YI}yDTw$U*y(0a{JdHY4|y_R%CX^- zC@W|g*;f0(^$vdgSGR9UuKShJ1Nz;gePS7c9g{{w@{d11Ga+tOl-qbGZHJpo7{@KA znAy|tJ&AL@C{9k==wy|w@Rzaq2Ab09++eFwVAyFCxsmkq%tbUh84T3Cmfbw@7Ug|T zU5dhHKQy-RAo4}{^V}4FXyc#_ea&(3aq(7k@Q`Jlm|dRs*t|uU>{FkmuW9W0#i~pf zVs>tndO|;Yr*U3x$ID>u=r2^$K#->o;DrZLH(G6}m17Wd3B9l~d6f!YnOuv5lF@<(A#=k;^jo@z;aHY9-33#iDXiYNRQoU>+2S7FQYeo>`y zqAUftf|wxlAQ#NjsgAED;aOHK@XAxKMD6%}Jm+SwKjId#)HjZUf#QFNegeufsi|u; zn~e_sX)Bg39IOA$#bRcyA#f^-8`LM|l?q$1^EyvC$^Cj_*nxB_cy^MnJY%aN85Yrc z=DJH8Ufdw`)BP%gvUY1Ttj6Bx!Q5&wkg~qSJz~YxXL`#nk9%Zxm*LmI%6(RXp$?3E zWyx-WN}bb%J=)7vqpZnACtSa>JBwKkBijF7oBx`aM(=T6ycSPF3<)cJ7ad6FWPinz z@*v2*N6Pxj#wSdi?t+X>mEfpunvXe0V1h(UeD5AbtdiG*1$1q&sByHu?vVo9A|I*f zjz`Tq9?~r#(vA$lxvpub+A%ag@)0$n_31qn9n9cLfz9>*4sbioG{`%S!AAL{AUrlj z2krAc6e#svLB9yUz^h10e^4dsSfVRi6y!nK{sNTL2$P=Y@pfceGKbj9Ou?M%k)f)@ z=la^VnLpYAU&Y6p)4%t Wc0R{rrOZ} literal 0 HcmV?d00001 diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@2x.png b/examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd019f20cb7c6fd8ee64fe00795cf711f95f7be GIT binary patch literal 7347 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
l|W3{%@QTNW9TTW)z zZ>>7!wK`cgX?w*L`}giCglwuuqYm1x>m0esW4NAGaf)#R60A;Tye2nK4yUf}VoN6=Wr8Icg7r9s>=(iex?hEU@bSc- z91dgAiDcJTh0mj%oHw<5!^WrGjR(@#Y5Y9<(d$(5-I$tqnPdFi9}p{OD_0`S?Q{sa&>r&c>k<@xSM>oeNmwc%l+`Y_Q4 zY7HalIC^2)M9vZB)i8}5>hdem2aVnFhiekb!HhWXnVbiCbsdo=UAPX0aVJHw_44E3 zOg{Jf#|LQ$4>m==@8NUJFR<5BoF0{GM?XGF96tc~9fg?szHIjXeMyv;R+g%eFbVt* Dg=7n% literal 0 HcmV?d00001 diff --git a/examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@3x.png b/examples/ASMapNode/Sample/Assets.xcassets/Water.imageset/water@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e45cd67f2d080f2d17af25f8278089381502e68f GIT binary patch literal 13644 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 VhnZ>~k$--1k`R# +#import + +@interface CustomMapAnnotation : NSObject + +@property (assign, nonatomic) CLLocationCoordinate2D coordinate; +@property (copy, nonatomic, nullable) UIImage *image; +@property (copy, nonatomic, nullable) NSString *title; +@property (copy, nonatomic, nullable) NSString *subtitle; + +@end diff --git a/examples/ASMapNode/Sample/CustomMapAnnotation.m b/examples/ASMapNode/Sample/CustomMapAnnotation.m new file mode 100644 index 0000000000..a5da10ac94 --- /dev/null +++ b/examples/ASMapNode/Sample/CustomMapAnnotation.m @@ -0,0 +1,22 @@ +// +// CustomMapAnnotation.m +// ASDKMapTest +// +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. An additional grant +// of patent rights can be found in the PATENTS file in the same directory. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#import "CustomMapAnnotation.h" + +@implementation CustomMapAnnotation + +@end diff --git a/examples/ASMapNode/Sample/MapHandlerNode.m b/examples/ASMapNode/Sample/MapHandlerNode.m index 8a78445bb2..fc55eb6bc6 100644 --- a/examples/ASMapNode/Sample/MapHandlerNode.m +++ b/examples/ASMapNode/Sample/MapHandlerNode.m @@ -16,6 +16,7 @@ // #import "MapHandlerNode.h" +#import "CustomMapAnnotation.h" #import @@ -90,6 +91,22 @@ [_liveMapToggleButton setTitle:[self liveMapStr] withFont:nil withColor:[UIColor blueColor] forState:ASControlStateNormal]; [_liveMapToggleButton setTitle:[self liveMapStr] withFont:[UIFont systemFontOfSize:14] withColor:[UIColor blueColor] forState:ASControlStateHighlighted]; [_liveMapToggleButton addTarget:self action:@selector(toggleLiveMap) forControlEvents:ASControlNodeEventTouchUpInside]; + + // avoiding retain cycles + __weak MapHandlerNode *weakSelf = self; + + self.mapNode.imageForStaticMapAnnotationBlock = ^UIImage *(id annotation, CGPoint *centerOffset){ + MapHandlerNode *grabbedSelf = weakSelf; + if (grabbedSelf) { + if ([annotation isKindOfClass:[CustomMapAnnotation class]]) { + CustomMapAnnotation *customAnnotation = (CustomMapAnnotation *)annotation; + return customAnnotation.image; + } + } + return nil; + }; + + [self addAnnotations]; } #pragma mark - Layout @@ -183,6 +200,30 @@ #pragma mark - Helpers +- (void)addAnnotations { + + MKPointAnnotation *brno = [MKPointAnnotation new]; + brno.coordinate = CLLocationCoordinate2DMake(49.2002211, 16.6078411); + brno.title = @"Brno city"; + + CustomMapAnnotation *atlantic = [CustomMapAnnotation new]; + atlantic.coordinate = CLLocationCoordinate2DMake(38.6442228, -29.9956942); + atlantic.title = @"Atlantic ocean"; + atlantic.image = [UIImage imageNamed:@"Water"]; + + CustomMapAnnotation *kilimanjaro = [CustomMapAnnotation new]; + kilimanjaro.coordinate = CLLocationCoordinate2DMake(-3.075833, 37.353333); + kilimanjaro.title = @"Kilimanjaro"; + kilimanjaro.image = [UIImage imageNamed:@"Hill"]; + + CustomMapAnnotation *mtblanc = [CustomMapAnnotation new]; + mtblanc.coordinate = CLLocationCoordinate2DMake(45.8325, 6.864444); + mtblanc.title = @"Mont Blanc"; + mtblanc.image = [UIImage imageNamed:@"Hill"]; + + self.mapNode.annotations = @[brno, atlantic, kilimanjaro, mtblanc]; +} + -(NSString *)liveMapStr { return _mapNode.liveMap ? @"Live Map is ON" : @"Live Map is OFF"; @@ -235,6 +276,21 @@ return YES; } +- (MKAnnotationView *)annotationViewForAnnotation:(id)annotation +{ + MKAnnotationView *av; + if ([annotation isKindOfClass:[CustomMapAnnotation class]]) { + av = [[MKAnnotationView alloc] init]; + av.centerOffset = CGPointMake(21, 21); + av.image = [(CustomMapAnnotation *)annotation image]; + } else { + av = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:@""]; + } + + av.opaque = NO; + return av; +} + #pragma mark - MKMapViewDelegate - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { @@ -244,4 +300,9 @@ _deltaLonEditableNode.attributedText = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%f", mapView.region.span.longitudeDelta]]; } +- (MKAnnotationView *)mapView:(MKMapView *)__unused mapView viewForAnnotation:(id)annotation +{ + return [self annotationViewForAnnotation:annotation]; +} + @end