From f9f22103125d5e3c7dd85daad7ff53eba01c40f8 Mon Sep 17 00:00:00 2001 From: Patrick Leonard Date: Fri, 14 Feb 2025 09:22:16 -0500 Subject: [PATCH] Update examples and add new interactions example (#2450) Co-authored-by: Release SDK bot for Maps SDK team --- Examples.xcodeproj/project.pbxproj | 228 ++++++++++-------- .../All Examples/StandardStyleExample.swift | 89 ++++++- .../StandardStyleInteractionsExample.swift | 193 +++++++++++++++ Sources/Examples/Models/Examples.swift | 3 + .../StandardInteractiveFeaturesExample.swift | 106 ++++---- .../StandardStyleImportExample.swift | 2 +- 6 files changed, 459 insertions(+), 162 deletions(-) create mode 100644 Sources/Examples/All Examples/StandardStyleInteractionsExample.swift diff --git a/Examples.xcodeproj/project.pbxproj b/Examples.xcodeproj/project.pbxproj index 72c21b35bd82..367c076cb411 100644 --- a/Examples.xcodeproj/project.pbxproj +++ b/Examples.xcodeproj/project.pbxproj @@ -3,61 +3,61 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ 01310DFD10B3804EE3548509 /* sf_airport_route.geojson in Resources */ = {isa = PBXBuildFile; fileRef = FE2A263DD2E9DC52CEE356FA /* sf_airport_route.geojson */; }; 03EDEA6452582E7E6805C824 /* CalloutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD8F852552CA316EFFCDD64 /* CalloutView.swift */; }; - 03EEF25ABD58ADD9631AB509 /* MapEventsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370DFCA52EB6C7F119BF81DA /* MapEventsExample.swift */; platformFilters = (ios, ); }; - 0414AD72988F405F5BA1D843 /* GlobeFlyToExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 384FD8FC97B9F5011AF4BD61 /* GlobeFlyToExample.swift */; platformFilters = (ios, ); }; - 05DF15DADC248A2CAA5EEDC4 /* AddMarkersSymbolExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = B33F64CDBA98B91EE819B2C4 /* AddMarkersSymbolExample.swift */; platformFilters = (ios, ); }; + 03EEF25ABD58ADD9631AB509 /* MapEventsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370DFCA52EB6C7F119BF81DA /* MapEventsExample.swift */; platformFilter = ios; }; + 0414AD72988F405F5BA1D843 /* GlobeFlyToExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 384FD8FC97B9F5011AF4BD61 /* GlobeFlyToExample.swift */; platformFilter = ios; }; + 05DF15DADC248A2CAA5EEDC4 /* AddMarkersSymbolExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = B33F64CDBA98B91EE819B2C4 /* AddMarkersSymbolExample.swift */; platformFilter = ios; }; 08DD7D352E50C412B667D6F6 /* CustomLayerExampleShaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = 5C0C8783B2A74AE9DE3F6C32 /* CustomLayerExampleShaders.metal */; }; - 0E191B29AE31584DCFDC3821 /* RasterColorExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D66333697502A83B85BCD9 /* RasterColorExample.swift */; platformFilters = (ios, ); }; - 10C2E5ADC16B91D43288E820 /* AdvancedViewportGesturesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FB717239BBFE5103C1EB1A4 /* AdvancedViewportGesturesExample.swift */; platformFilters = (ios, ); }; - 10ECE7FE19CEC239DDA96961 /* ExampleProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10C7CEE3F343DF482D428211 /* ExampleProtocol.swift */; platformFilters = (ios, ); }; - 1372F3B8047B6B4EE70933D9 /* StandardStyleExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996964F634A4536F664C2611 /* StandardStyleExample.swift */; platformFilters = (ios, ); }; - 14799547EFD5C4757FBAD6E4 /* ViewportExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0C19E67A2E87A3D18B7B511 /* ViewportExample.swift */; platformFilters = (ios, ); }; + 0E191B29AE31584DCFDC3821 /* RasterColorExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D66333697502A83B85BCD9 /* RasterColorExample.swift */; platformFilter = ios; }; + 10C2E5ADC16B91D43288E820 /* AdvancedViewportGesturesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FB717239BBFE5103C1EB1A4 /* AdvancedViewportGesturesExample.swift */; platformFilter = ios; }; + 10ECE7FE19CEC239DDA96961 /* ExampleProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10C7CEE3F343DF482D428211 /* ExampleProtocol.swift */; platformFilter = ios; }; + 1372F3B8047B6B4EE70933D9 /* StandardStyleExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996964F634A4536F664C2611 /* StandardStyleExample.swift */; platformFilter = ios; }; + 14799547EFD5C4757FBAD6E4 /* ViewportExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0C19E67A2E87A3D18B7B511 /* ViewportExample.swift */; platformFilter = ios; }; 1687412AC1637D7EA697C7A4 /* View+OnShake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83E9078B1B13E54C2FFC5FFC /* View+OnShake.swift */; }; 1820AE40702C7875656BA2D7 /* radar0.gif in Resources */ = {isa = PBXBuildFile; fileRef = 1BCE444AC33D2F1F88F4CCF0 /* radar0.gif */; }; 18919387995A155D6F64DADF /* StandardInteractiveBuildingsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E97E057D9FFB1DE3E16F1F0B /* StandardInteractiveBuildingsExample.swift */; }; 18F76FE745B049D1F0CAF6CA /* GeoJSONSourceExample.geojson in Resources */ = {isa = PBXBuildFile; fileRef = F033C8EFB89A90D6705B047D /* GeoJSONSourceExample.geojson */; }; - 191391C51FC69A6D36EB67F0 /* ResizableImageExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A0818B5BC601707E3235A9 /* ResizableImageExample.swift */; platformFilters = (ios, ); }; - 1B5230204B5659B1F05C303D /* DataDrivenSymbolsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A72B5DBF68C4729A5DC65D /* DataDrivenSymbolsExample.swift */; platformFilters = (ios, ); }; - 1B97702805C5EC4703A6CAA9 /* LineAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDE7738CA55957F3FAC3ECE /* LineAnnotationExample.swift */; platformFilters = (ios, ); }; - 1C70390E725564D6E60865EF /* DistanceExpressionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CCB8EE8E1C9C6CC85DA5D36 /* DistanceExpressionExample.swift */; platformFilters = (ios, ); }; + 191391C51FC69A6D36EB67F0 /* ResizableImageExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12A0818B5BC601707E3235A9 /* ResizableImageExample.swift */; platformFilter = ios; }; + 1B5230204B5659B1F05C303D /* DataDrivenSymbolsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A72B5DBF68C4729A5DC65D /* DataDrivenSymbolsExample.swift */; platformFilter = ios; }; + 1B97702805C5EC4703A6CAA9 /* LineAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDE7738CA55957F3FAC3ECE /* LineAnnotationExample.swift */; platformFilter = ios; }; + 1C70390E725564D6E60865EF /* DistanceExpressionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CCB8EE8E1C9C6CC85DA5D36 /* DistanceExpressionExample.swift */; platformFilter = ios; }; 1DAE02D73D16E543777C2025 /* ClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46CE3D9C2873C0767DD76D85 /* ClusteringExample.swift */; }; - 1F860D5B445E75772C4C3B6C /* SkyLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93B8372871DB4BC991737A06 /* SkyLayerExample.swift */; platformFilters = (ios, ); }; - 215230836B6AD1040D3DA547 /* CombineLocationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4EE8F38428A64B5B9D4DBBE /* CombineLocationExample.swift */; platformFilters = (ios, ); }; + 1F860D5B445E75772C4C3B6C /* SkyLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93B8372871DB4BC991737A06 /* SkyLayerExample.swift */; platformFilter = ios; }; + 215230836B6AD1040D3DA547 /* CombineLocationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4EE8F38428A64B5B9D4DBBE /* CombineLocationExample.swift */; platformFilter = ios; }; 2997D21A7DB20098C6D03D3B /* StandardStyleImportExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640198169EEDFC7CBEFCFCCF /* StandardStyleImportExample.swift */; }; 2B44F3E8EF3A50D9AE6B825F /* route.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 450C8D5E4B84428FE51BCA97 /* route.geojson */; }; - 2C03342240D5487880316518 /* AddOneMarkerSymbolExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCBE814694CF08A9C2E4A42 /* AddOneMarkerSymbolExample.swift */; platformFilters = (ios, ); }; + 2C03342240D5487880316518 /* AddOneMarkerSymbolExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCBE814694CF08A9C2E4A42 /* AddOneMarkerSymbolExample.swift */; platformFilter = ios; }; 30589E5AB307FC934E466332 /* radar2.gif in Resources */ = {isa = PBXBuildFile; fileRef = D8730F8FB259A4F889609108 /* radar2.gif */; }; 312CE7CED726F0A572301622 /* PinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC3D7884D057238010CB6E4 /* PinView.swift */; }; 32FA2A4133B0464494212B34 /* Array+Split.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB15B17EDE597D37CFF3FCA /* Array+Split.swift */; }; - 33B816803AF5330796686AA1 /* CameraForExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF35650C6319088CAAF95F84 /* CameraForExample.swift */; platformFilters = (ios, ); }; - 373BD1EE35B76E43534E23F6 /* Fingertips in Frameworks */ = {isa = PBXBuildFile; platformFilters = (ios, ); productRef = FD9311FF1C736B80A26F4258 /* Fingertips */; }; + 33B816803AF5330796686AA1 /* CameraForExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF35650C6319088CAAF95F84 /* CameraForExample.swift */; platformFilter = ios; }; + 373BD1EE35B76E43534E23F6 /* Fingertips in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = FD9311FF1C736B80A26F4258 /* Fingertips */; }; 38AD95B6DD9BE858F4E59C31 /* WeatherAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D21963A6FF5DA26A210DA5 /* WeatherAnnotationExample.swift */; }; - 38DF3926AD9DDDE883454F64 /* TestableExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB74046A2FC03770B62B9E6 /* TestableExampleTests.swift */; platformFilters = (ios, ); }; - 392857DBD1231B0438144335 /* AnimatedMarkerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44C0F343A1B5F4DA0C19B9C /* AnimatedMarkerExample.swift */; platformFilters = (ios, ); }; + 38DF3926AD9DDDE883454F64 /* TestableExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB74046A2FC03770B62B9E6 /* TestableExampleTests.swift */; platformFilter = ios; }; + 392857DBD1231B0438144335 /* AnimatedMarkerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44C0F343A1B5F4DA0C19B9C /* AnimatedMarkerExample.swift */; platformFilter = ios; }; 3B4862E6832F23CB115D444A /* ClipLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A3027A7DA59E090DAD25F1 /* ClipLayerExample.swift */; }; 3E515D1DD1D9CA02F3E95AA2 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D03F5A3A0E879717BFE421 /* Constants.swift */; }; - 3FD83483E0AE57790504CB0C /* MapRecorderExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E612275E3042D0D0AF8B583E /* MapRecorderExample.swift */; platformFilters = (ios, ); }; - 4105BDB79F22905F065071F3 /* CustomRasterSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F6B4718F05FB1E6736EA1FF /* CustomRasterSourceExample.swift */; platformFilters = (ios, ); }; - 423A42B555DD0B3AD4856FCF /* InsetMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BCB1CC4577300FEF4DE017B /* InsetMapExample.swift */; platformFilters = (ios, ); }; - 4417BB8A356335BC8421A19B /* PointClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 289434058C4AB25A17655FEF /* PointClusteringExample.swift */; platformFilters = (ios, ); }; - 442DB919BE75CE7B0A537757 /* SpinningGlobeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A182413E535260335459F26 /* SpinningGlobeExample.swift */; platformFilters = (ios, ); }; - 4791CACAC0846107E4B0955B /* SceneKitExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267AA1719061B281479BBBCB /* SceneKitExample.swift */; platformFilters = (ios, ); }; - 48040990713D3220E7055434 /* LiveDataExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4DA62349C7E9846A885BCD3 /* LiveDataExample.swift */; platformFilters = (ios, ); }; - 49F6209402BF34C06C90107A /* HeatmapLayerGlobeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70922E748D003176C4A3C60A /* HeatmapLayerGlobeExample.swift */; platformFilters = (ios, ); }; - 4ACB99FAFBF38A425EBD0285 /* ModelLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D98F58F756D035C98B1F39 /* ModelLayerExample.swift */; platformFilters = (ios, ); }; + 3FD83483E0AE57790504CB0C /* MapRecorderExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E612275E3042D0D0AF8B583E /* MapRecorderExample.swift */; platformFilter = ios; }; + 4105BDB79F22905F065071F3 /* CustomRasterSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F6B4718F05FB1E6736EA1FF /* CustomRasterSourceExample.swift */; platformFilter = ios; }; + 423A42B555DD0B3AD4856FCF /* InsetMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BCB1CC4577300FEF4DE017B /* InsetMapExample.swift */; platformFilter = ios; }; + 4417BB8A356335BC8421A19B /* PointClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 289434058C4AB25A17655FEF /* PointClusteringExample.swift */; platformFilter = ios; }; + 442DB919BE75CE7B0A537757 /* SpinningGlobeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A182413E535260335459F26 /* SpinningGlobeExample.swift */; platformFilter = ios; }; + 4791CACAC0846107E4B0955B /* SceneKitExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267AA1719061B281479BBBCB /* SceneKitExample.swift */; platformFilter = ios; }; + 48040990713D3220E7055434 /* LiveDataExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4DA62349C7E9846A885BCD3 /* LiveDataExample.swift */; platformFilter = ios; }; + 49F6209402BF34C06C90107A /* HeatmapLayerGlobeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70922E748D003176C4A3C60A /* HeatmapLayerGlobeExample.swift */; platformFilter = ios; }; + 4ACB99FAFBF38A425EBD0285 /* ModelLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2D98F58F756D035C98B1F39 /* ModelLayerExample.swift */; platformFilter = ios; }; 4E64A70408A69F2BC9F70610 /* CustomGeometrySourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DED80ACD1618F8EE8F95A4A /* CustomGeometrySourceExample.swift */; }; - 4EF3E4C342C3F8ED5BF6C332 /* ViewAnnotationMarkerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1317C28ACDAC187017096A99 /* ViewAnnotationMarkerExample.swift */; platformFilters = (ios, ); }; + 4EF3E4C342C3F8ED5BF6C332 /* ViewAnnotationMarkerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1317C28ACDAC187017096A99 /* ViewAnnotationMarkerExample.swift */; platformFilter = ios; }; 50641F1F3A58B85873E2E5B8 /* AttributionDialogueExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A77AEDBF679F223D4412FEE /* AttributionDialogueExamples.swift */; }; - 556C8423BA408C7FF54BB5DA /* AnimateLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A7965C46F2F371AA940A99 /* AnimateLayerExample.swift */; platformFilters = (ios, ); }; + 556C8423BA408C7FF54BB5DA /* AnimateLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A7965C46F2F371AA940A99 /* AnimateLayerExample.swift */; platformFilter = ios; }; 560D4A0D2C704ECC346D8B5F /* fragment-realestate-NY.json in Resources */ = {isa = PBXBuildFile; fileRef = 50618B3CF42CCF735CCAE9B4 /* fragment-realestate-NY.json */; }; - 56446E388868862E2BB80F4D /* ViewAnnotationWithPointAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB726A94B069761528B57EC8 /* ViewAnnotationWithPointAnnotationExample.swift */; platformFilters = (ios, ); }; - 5A28C124249725578389175A /* ColorExpressionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9B2D532D2F54C6C40DA466 /* ColorExpressionExample.swift */; platformFilters = (ios, ); }; + 56446E388868862E2BB80F4D /* ViewAnnotationWithPointAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB726A94B069761528B57EC8 /* ViewAnnotationWithPointAnnotationExample.swift */; platformFilter = ios; }; + 5A28C124249725578389175A /* ColorExpressionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9B2D532D2F54C6C40DA466 /* ColorExpressionExample.swift */; platformFilter = ios; }; 5A68CBA756780F7DE8F7BDCC /* radar3.gif in Resources */ = {isa = PBXBuildFile; fileRef = 24FD45C982E4403DA3BD241A /* radar3.gif */; }; 5A6D7B2A302A6555FE23FF80 /* blueprint_style.json in Resources */ = {isa = PBXBuildFile; fileRef = 989F5AB9D5D8AD39D21327A1 /* blueprint_style.json */; }; 5B2CE02503AF44EBC86FE884 /* MapboxMaps in Frameworks */ = {isa = PBXBuildFile; productRef = 0AF5F744C6369BF1FB233FB6 /* MapboxMaps */; }; @@ -65,98 +65,99 @@ 5F2AD73C8104089C9291574E /* GeofencingUserLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3A816C6E4D7A0A532EEE84 /* GeofencingUserLocation.swift */; }; 5F537B052041931CB507E12B /* ViewportPlayground.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE863B179BF4F740C36D185E /* ViewportPlayground.swift */; }; 5F556CB71C442EC2A8C2E229 /* VisionOSMain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96B0E9086FE939F5D723136D /* VisionOSMain.swift */; platformFilters = (xros, ); }; - 5FF3E34B523C39A404154BF7 /* OfflineRegionManagerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1229327C13654C370B5641FC /* OfflineRegionManagerExample.swift */; platformFilters = (ios, ); }; - 60A1572CCF5763FA3C946B89 /* Custom2DPuckExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262AD875661BAB5564084A9E /* Custom2DPuckExample.swift */; platformFilters = (ios, ); }; + 5FF3E34B523C39A404154BF7 /* OfflineRegionManagerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1229327C13654C370B5641FC /* OfflineRegionManagerExample.swift */; platformFilter = ios; }; + 60A1572CCF5763FA3C946B89 /* Custom2DPuckExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262AD875661BAB5564084A9E /* Custom2DPuckExample.swift */; platformFilter = ios; }; 61B79A9069DCE6865E43E261 /* radar4.gif in Resources */ = {isa = PBXBuildFile; fileRef = 876CE24F4E565ED342DDDCD6 /* radar4.gif */; }; - 634BA74F4E553C53EE906F5A /* OfflineManagerExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 000D0E4CEFB6D5AF02518807 /* OfflineManagerExample.storyboard */; platformFilters = (ios, ); }; + 634BA74F4E553C53EE906F5A /* OfflineManagerExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 000D0E4CEFB6D5AF02518807 /* OfflineManagerExample.storyboard */; platformFilter = ios; }; 64F4FA139388DB34564AD42D /* CLLocationCoordinate2D+Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455C0B9F01316D0FF38ED62B /* CLLocationCoordinate2D+Random.swift */; }; - 655105BD0FAFF4C4BA65DC32 /* ExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE19F00E87B31FDE5481D56 /* ExamplesTests.swift */; platformFilters = (ios, ); }; - 65E9F2B993AEB394FC2D0080 /* ColorThemeMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F519EC4AF0B4BEE0FDCABC /* ColorThemeMapExample.swift */; platformFilters = (ios, ); }; - 6661DB69D4980E24BCA18AB2 /* PolygonAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DCBE4524A8793B4DE950533 /* PolygonAnnotationExample.swift */; platformFilters = (ios, ); }; - 68FD9E1F4606B2729BA1E6DC /* SnapshotterExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588FD640D91E9DD366703F7B /* SnapshotterExample.swift */; platformFilters = (ios, ); }; - 6B040F65241ABF600D70D14D /* Custom3DPuckExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C957F9CA07061B793C2DD4A /* Custom3DPuckExample.swift */; platformFilters = (ios, ); }; - 7036A19FCD2CCE85BDDF4E00 /* TrackingModeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F5E598A16FA446F583344CB /* TrackingModeExample.swift */; platformFilters = (ios, ); }; - 7365170E39A459EB4DFA198B /* ExamplesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE18E37A8652B4807D2459F1 /* ExamplesUITests.swift */; platformFilters = (ios, ); }; + 655105BD0FAFF4C4BA65DC32 /* ExamplesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE19F00E87B31FDE5481D56 /* ExamplesTests.swift */; platformFilter = ios; }; + 65E9F2B993AEB394FC2D0080 /* ColorThemeMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F519EC4AF0B4BEE0FDCABC /* ColorThemeMapExample.swift */; platformFilter = ios; }; + 6661DB69D4980E24BCA18AB2 /* PolygonAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DCBE4524A8793B4DE950533 /* PolygonAnnotationExample.swift */; platformFilter = ios; }; + 68FD9E1F4606B2729BA1E6DC /* SnapshotterExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588FD640D91E9DD366703F7B /* SnapshotterExample.swift */; platformFilter = ios; }; + 6B040F65241ABF600D70D14D /* Custom3DPuckExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C957F9CA07061B793C2DD4A /* Custom3DPuckExample.swift */; platformFilter = ios; }; + 7036A19FCD2CCE85BDDF4E00 /* TrackingModeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F5E598A16FA446F583344CB /* TrackingModeExample.swift */; platformFilter = ios; }; + 73502E332D5D654A003B6A64 /* StandardStyleInteractionsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73502E322D5D6544003B6A64 /* StandardStyleInteractionsExample.swift */; }; + 7365170E39A459EB4DFA198B /* ExamplesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE18E37A8652B4807D2459F1 /* ExamplesUITests.swift */; platformFilter = ios; }; 759D42AA5FE93B6FA9DFADF5 /* LocationOverrideExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B39AE24486FED5ED30392D /* LocationOverrideExample.swift */; }; - 7686448F8648BECC75A912B6 /* DashboardCarPlaySceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 913B4773A82AD6357D6AAEA1 /* DashboardCarPlaySceneDelegate.swift */; platformFilters = (ios, ); }; + 7686448F8648BECC75A912B6 /* DashboardCarPlaySceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 913B4773A82AD6357D6AAEA1 /* DashboardCarPlaySceneDelegate.swift */; platformFilter = ios; }; 79843B780E7C5DC68433B745 /* SnapshotMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC5A8729C9AEA4711B56B5F0 /* SnapshotMapExample.swift */; }; - 79B889CF23A3C0A5EA7F6ADD /* ApplicationCarPlaySceneDelegage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3F37CAE7A0B66BE429525C /* ApplicationCarPlaySceneDelegage.swift */; platformFilters = (ios, ); }; - 7B9835E597E0B2655E181A48 /* ExampleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0A6063E57EC170F558A3F74 /* ExampleTableViewController.swift */; platformFilters = (ios, ); }; + 79B889CF23A3C0A5EA7F6ADD /* ApplicationCarPlaySceneDelegage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3F37CAE7A0B66BE429525C /* ApplicationCarPlaySceneDelegage.swift */; platformFilter = ios; }; + 7B9835E597E0B2655E181A48 /* ExampleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0A6063E57EC170F558A3F74 /* ExampleTableViewController.swift */; platformFilter = ios; }; 7E84D4D6459049E452808C91 /* AnnotationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = F890746B56E20150A053B41B /* AnnotationsExample.swift */; }; 7EDF38D2E9CDE489F320977E /* SwiftUIRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CEF3209781923E53974F20 /* SwiftUIRoot.swift */; }; 803CCCEA28B209111BE0786F /* sportcar.glb in Resources */ = {isa = PBXBuildFile; fileRef = C47942F80A50166AC823012B /* sportcar.glb */; }; - 821807D61D52F0E60925BCD4 /* CameraAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E3A0CCD53B02FF2BAD830A2 /* CameraAnimationExample.swift */; platformFilters = (ios, ); }; + 821807D61D52F0E60925BCD4 /* CameraAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E3A0CCD53B02FF2BAD830A2 /* CameraAnimationExample.swift */; platformFilter = ios; }; 83DCCC7FEFF6D94D3DF0B587 /* 34M_17.dae in Resources */ = {isa = PBXBuildFile; fileRef = 28CE7DA39D29A8311E4A58A4 /* 34M_17.dae */; }; 8418F1775D49F5A66489B988 /* ViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F393DF039D7AD2F35C8DE4CE /* ViewExtensions.swift */; }; 854CE1A84AADF6FBB232CB5F /* FeaturesQueryExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6B06A1D70F479D8DC5C375A /* FeaturesQueryExample.swift */; }; 85AA0D942D4C0E218D87F7D8 /* GradientLine.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 2DD8B1D25297B7433F4AAF35 /* GradientLine.geojson */; }; - 85E0F727CBB3374D3EF499C3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 55FDF5B3329BFD6E6C346D80 /* LaunchScreen.storyboard */; platformFilters = (ios, ); }; - 86AED5DD9F8C8BB2C9736483 /* ResizeMapViewExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E54D3F5943238258AA0A9BE /* ResizeMapViewExample.swift */; platformFilters = (ios, ); }; + 85E0F727CBB3374D3EF499C3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 55FDF5B3329BFD6E6C346D80 /* LaunchScreen.storyboard */; platformFilter = ios; }; + 86AED5DD9F8C8BB2C9736483 /* ResizeMapViewExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E54D3F5943238258AA0A9BE /* ResizeMapViewExample.swift */; platformFilter = ios; }; 8913C410B72BE0C40EE02BB9 /* MapSettingsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6E875420B5C674C8CCAB9B1 /* MapSettingsExample.swift */; }; - 8B4085733CCABE3BE3D16F7E /* LayerPositionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99610E884967673F7F28D2B2 /* LayerPositionExample.swift */; platformFilters = (ios, ); }; + 8B4085733CCABE3BE3D16F7E /* LayerPositionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99610E884967673F7F28D2B2 /* LayerPositionExample.swift */; platformFilter = ios; }; 8F0BEA796867B64E48A1B328 /* StandardStyleLocationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6F1212BB2453DBFECE12F2 /* StandardStyleLocationsExample.swift */; }; - 902FD51EC410A1E8BD88941D /* NavigationSimulatorExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A090EE21C9A65BE2697868F /* NavigationSimulatorExample.swift */; platformFilters = (ios, ); }; - 918F4BDCC25819DD68BC9518 /* LayerSlotExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D058C94675BB58AE74392829 /* LayerSlotExample.swift */; platformFilters = (ios, ); }; - 94DB7E8C829041DC5F5B2300 /* InstrumentClusterCarPlaySceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AD7661708AEADD25AB726B4 /* InstrumentClusterCarPlaySceneDelegate.swift */; platformFilters = (ios, ); }; - 9717811318AAE88DE9214307 /* GeofencingExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9127909E8758EAC82E19F7 /* GeofencingExample.swift */; platformFilters = (ios, ); }; - 9A403D6AB6D6336E212726C5 /* CameraAnimatorsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDABBED8502001D17EF30F35 /* CameraAnimatorsExample.swift */; platformFilters = (ios, ); }; - 9DFE9DDE63B78393031C843E /* Examples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B30F4697545D9F02DD4425D /* Examples.swift */; platformFilters = (ios, ); }; - A3D7C0836BFE6FEB40C3C15A /* BasicLocationPulsingExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC98E9169E8E7DFE8DC1CB27 /* BasicLocationPulsingExample.swift */; platformFilters = (ios, ); }; - A6389C28B8AAC39878591AD0 /* PitchAndDistanceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5C0A3C44715B96D646ACB7 /* PitchAndDistanceExample.swift */; platformFilters = (ios, ); }; + 902FD51EC410A1E8BD88941D /* NavigationSimulatorExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A090EE21C9A65BE2697868F /* NavigationSimulatorExample.swift */; platformFilter = ios; }; + 918F4BDCC25819DD68BC9518 /* LayerSlotExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D058C94675BB58AE74392829 /* LayerSlotExample.swift */; platformFilter = ios; }; + 94DB7E8C829041DC5F5B2300 /* InstrumentClusterCarPlaySceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AD7661708AEADD25AB726B4 /* InstrumentClusterCarPlaySceneDelegate.swift */; platformFilter = ios; }; + 9717811318AAE88DE9214307 /* GeofencingExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9127909E8758EAC82E19F7 /* GeofencingExample.swift */; platformFilter = ios; }; + 9A403D6AB6D6336E212726C5 /* CameraAnimatorsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDABBED8502001D17EF30F35 /* CameraAnimatorsExample.swift */; platformFilter = ios; }; + 9DFE9DDE63B78393031C843E /* Examples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B30F4697545D9F02DD4425D /* Examples.swift */; platformFilter = ios; }; + A3D7C0836BFE6FEB40C3C15A /* BasicLocationPulsingExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC98E9169E8E7DFE8DC1CB27 /* BasicLocationPulsingExample.swift */; platformFilter = ios; }; + A6389C28B8AAC39878591AD0 /* PitchAndDistanceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5C0A3C44715B96D646ACB7 /* PitchAndDistanceExample.swift */; platformFilter = ios; }; A6A68B4ED674A924ACBD8FA2 /* UIColor+Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = F000C4D3B6FC70FA9607E3A3 /* UIColor+Random.swift */; }; - A972D3306BC53DEC9798C60D /* ExternalVectorSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E4EABC7540ED460F08B8F /* ExternalVectorSourceExample.swift */; platformFilters = (ios, ); }; + A972D3306BC53DEC9798C60D /* ExternalVectorSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133E4EABC7540ED460F08B8F /* ExternalVectorSourceExample.swift */; platformFilter = ios; }; AD0922FA7F69AEE4C23F2351 /* InteractionsPlayground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388932B3A65BB7E9B59FDBE0 /* InteractionsPlayground.swift */; }; - AE51E276DCD8CF89AB339224 /* LongTapAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DB76F486D80FED88678B04D /* LongTapAnimationExample.swift */; platformFilters = (ios, ); }; - AE6E90DB7B6DA4580C2DAB59 /* FrameViewAnnotationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC0F09FF1EF1A88BC1C6545 /* FrameViewAnnotationsExample.swift */; platformFilters = (ios, ); }; + AE51E276DCD8CF89AB339224 /* LongTapAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DB76F486D80FED88678B04D /* LongTapAnimationExample.swift */; platformFilter = ios; }; + AE6E90DB7B6DA4580C2DAB59 /* FrameViewAnnotationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC0F09FF1EF1A88BC1C6545 /* FrameViewAnnotationsExample.swift */; platformFilter = ios; }; B304BACFCD08802A740E8919 /* PuckPlayground.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0CC67084BA1191D0B179A94 /* PuckPlayground.swift */; }; - B53EA441C54E2B680A7E99F0 /* BuildingExtrusionsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFF80A86D7DEF54E0A7256DF /* BuildingExtrusionsExample.swift */; platformFilters = (ios, ); }; - B9B1EE72E6203358F2785916 /* IconSizeChangeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6F479FB7FFD90FA95F400E /* IconSizeChangeExample.swift */; platformFilters = (ios, ); }; - B9D4B9C3042383738AB5B667 /* DebugMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59EF8798357CF55109A4E56 /* DebugMapExample.swift */; platformFilters = (ios, ); }; - BD99E89F050E7D93846147FF /* ViewAnnotationBasicExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3C6CF222C8EE9AE69563E39 /* ViewAnnotationBasicExample.swift */; platformFilters = (ios, ); }; - BDABAAC8727AF67A0DEE2020 /* AnimateGeoJSONLineExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7274E152F7FBB7894447F822 /* AnimateGeoJSONLineExample.swift */; platformFilters = (ios, ); }; - C04160BF66055F7DE9315395 /* Lights3DExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A8CD8A69D3429FCF8ACBDD /* Lights3DExample.swift */; platformFilters = (ios, ); }; - C315E1C61D222296FE0244FC /* VoiceOverAccessibilityExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D91A8B64951711546335530 /* VoiceOverAccessibilityExample.swift */; platformFilters = (ios, ); }; + B53EA441C54E2B680A7E99F0 /* BuildingExtrusionsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFF80A86D7DEF54E0A7256DF /* BuildingExtrusionsExample.swift */; platformFilter = ios; }; + B9B1EE72E6203358F2785916 /* IconSizeChangeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6F479FB7FFD90FA95F400E /* IconSizeChangeExample.swift */; platformFilter = ios; }; + B9D4B9C3042383738AB5B667 /* DebugMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59EF8798357CF55109A4E56 /* DebugMapExample.swift */; platformFilter = ios; }; + BD99E89F050E7D93846147FF /* ViewAnnotationBasicExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3C6CF222C8EE9AE69563E39 /* ViewAnnotationBasicExample.swift */; platformFilter = ios; }; + BDABAAC8727AF67A0DEE2020 /* AnimateGeoJSONLineExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7274E152F7FBB7894447F822 /* AnimateGeoJSONLineExample.swift */; platformFilter = ios; }; + C04160BF66055F7DE9315395 /* Lights3DExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A8CD8A69D3429FCF8ACBDD /* Lights3DExample.swift */; platformFilter = ios; }; + C315E1C61D222296FE0244FC /* VoiceOverAccessibilityExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D91A8B64951711546335530 /* VoiceOverAccessibilityExample.swift */; platformFilter = ios; }; C327DBA17D79D5DFBBE84BE0 /* ButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858990E6795D3162A941E82C /* ButtonStyle.swift */; }; - C664365A373267B564EC84EE /* CombineExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DBF737C9C7FBF46BB5F7B78 /* CombineExample.swift */; platformFilters = (ios, ); }; + C664365A373267B564EC84EE /* CombineExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DBF737C9C7FBF46BB5F7B78 /* CombineExample.swift */; platformFilter = ios; }; C6E1E615C75960D1BD1755A9 /* annotations.json in Resources */ = {isa = PBXBuildFile; fileRef = B05B410135D0B466B73C0765 /* annotations.json */; }; C940835B030A20F0C5BC31AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B31A932A62B6142FE20C39DF /* Assets.xcassets */; }; - C953F022C91FCA59CFF06BE9 /* SymbolClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FD38B8D20C0695A03AE4E68 /* SymbolClusteringExample.swift */; platformFilters = (ios, ); }; - CA2209956E93ECB18C4C9DEC /* CircleAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1658938A5F0908D151A9B9 /* CircleAnnotationExample.swift */; platformFilters = (ios, ); }; + C953F022C91FCA59CFF06BE9 /* SymbolClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FD38B8D20C0695A03AE4E68 /* SymbolClusteringExample.swift */; platformFilter = ios; }; + CA2209956E93ECB18C4C9DEC /* CircleAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1658938A5F0908D151A9B9 /* CircleAnnotationExample.swift */; platformFilter = ios; }; CBCC60FF68BE9754DE0C6AF3 /* DynamicStylingExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = C61CC711054A032EE0446036 /* DynamicStylingExample.swift */; }; - CBD01BBA4E78796827A6E52D /* RuntimeSlotsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AB4D202692A8951BAF2D57 /* RuntimeSlotsExample.swift */; platformFilters = (ios, ); }; - CF5C5513D659D4981706DDEC /* ViewAnnotationAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E5647315A2357320BCF575 /* ViewAnnotationAnimationExample.swift */; platformFilters = (ios, ); }; - D27F0573360A7234BCF7AB6C /* AnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC8E7B565C817D872CFBCAD /* AnnotationView.swift */; platformFilters = (ios, ); }; - D4FFFAE49D4B805BDA014AAD /* BasicMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257F10278F5E580C7ABA5570 /* BasicMapExample.swift */; platformFilters = (ios, ); }; - D62F69A9BD802A1926B92968 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BB52F9D3A810B1A9CEC832C /* Example.swift */; platformFilters = (ios, ); }; - D63431CA78A557A0FB92177A /* FeatureStateExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3FA795972BB141B9C582ED0 /* FeatureStateExample.swift */; platformFilters = (ios, ); }; - D77EEB488CFD90F602077E8F /* CustomPointAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D5DB9BD5E97D3C0080EC5D3 /* CustomPointAnnotationExample.swift */; platformFilters = (ios, ); }; + CBD01BBA4E78796827A6E52D /* RuntimeSlotsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AB4D202692A8951BAF2D57 /* RuntimeSlotsExample.swift */; platformFilter = ios; }; + CF5C5513D659D4981706DDEC /* ViewAnnotationAnimationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E5647315A2357320BCF575 /* ViewAnnotationAnimationExample.swift */; platformFilter = ios; }; + D27F0573360A7234BCF7AB6C /* AnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC8E7B565C817D872CFBCAD /* AnnotationView.swift */; platformFilter = ios; }; + D4FFFAE49D4B805BDA014AAD /* BasicMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257F10278F5E580C7ABA5570 /* BasicMapExample.swift */; platformFilter = ios; }; + D62F69A9BD802A1926B92968 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BB52F9D3A810B1A9CEC832C /* Example.swift */; platformFilter = ios; }; + D63431CA78A557A0FB92177A /* FeatureStateExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3FA795972BB141B9C582ED0 /* FeatureStateExample.swift */; platformFilter = ios; }; + D77EEB488CFD90F602077E8F /* CustomPointAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D5DB9BD5E97D3C0080EC5D3 /* CustomPointAnnotationExample.swift */; platformFilter = ios; }; D9297596469F9B31C2350B43 /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A615EFC3D6CF2A25C9864086 /* UIViewController+Extensions.swift */; }; - D94672F30272E31087AB5DDD /* NavigationSimulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC5980DD30479F30127BA71 /* NavigationSimulator.swift */; platformFilters = (ios, ); }; + D94672F30272E31087AB5DDD /* NavigationSimulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FC5980DD30479F30127BA71 /* NavigationSimulator.swift */; platformFilter = ios; }; D98624793DA36578289F02FF /* MapScrollExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65535FB9F190778001AB847A /* MapScrollExample.swift */; }; DA109856E64BBD8071DF0619 /* ColorThemeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DD4C2F0049E575A6B5BF66 /* ColorThemeExample.swift */; }; - DA69CB0BD9F0DDA0FD1387B0 /* DataJoinExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D0CD9C2D04EA5B12E7F84C /* DataJoinExample.swift */; platformFilters = (ios, ); }; + DA69CB0BD9F0DDA0FD1387B0 /* DataJoinExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D0CD9C2D04EA5B12E7F84C /* DataJoinExample.swift */; platformFilter = ios; }; DCA54F7383085A8FD822F0BF /* GeofencingPlayground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7613C4E19DCD679A2620223C /* GeofencingPlayground.swift */; }; - DFC64A62538E787D57B6514D /* DynamicViewAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3333EF3E0F1C789809F385AF /* DynamicViewAnnotationExample.swift */; platformFilters = (ios, ); }; + DFC64A62538E787D57B6514D /* DynamicViewAnnotationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3333EF3E0F1C789809F385AF /* DynamicViewAnnotationExample.swift */; platformFilter = ios; }; E121F023995CCF2F3A65BC2A /* LocateMeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DA0608D44DEF6C4A82777C /* LocateMeExample.swift */; }; E2617ACF1E2367C012A87CD1 /* ViewAnnotationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AACE9E33102AE90526569F /* ViewAnnotationsExample.swift */; }; - E2CD9B66367265509567A4E3 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 524D79FF01638A0E8A3C1248 /* .swiftlint.yml */; platformFilters = (ios, ); }; - E5A3B926DD7E451F1E660547 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274D496EC7E47F63FD0D1337 /* AppDelegate.swift */; platformFilters = (ios, ); }; - E6B722A64C15CE701287B464 /* OfflineManagerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C452C7342E73F6F16A83C /* OfflineManagerExample.swift */; platformFilters = (ios, ); }; - E8CEBC697D805204F129C4FB /* RasterTileSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FA937DC17F7EA27931763A /* RasterTileSourceExample.swift */; platformFilters = (ios, ); }; + E2CD9B66367265509567A4E3 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 524D79FF01638A0E8A3C1248 /* .swiftlint.yml */; platformFilter = ios; }; + E5A3B926DD7E451F1E660547 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 274D496EC7E47F63FD0D1337 /* AppDelegate.swift */; platformFilter = ios; }; + E6B722A64C15CE701287B464 /* OfflineManagerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 083C452C7342E73F6F16A83C /* OfflineManagerExample.swift */; platformFilter = ios; }; + E8CEBC697D805204F129C4FB /* RasterTileSourceExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FA937DC17F7EA27931763A /* RasterTileSourceExample.swift */; platformFilter = ios; }; EB39F159A9F5DFAB935F629D /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26964B05A794CC808C594AB5 /* SwiftExtensions.swift */; }; - EE4064D753E360A6A6AC5BAC /* CustomLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06955521CCC52B47AAB475F4 /* CustomLayerExample.swift */; platformFilters = (ios, ); }; - F0502A1ACF0AED218F8184AB /* CarPlayMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6CEA9899CC0EC4F4381E19 /* CarPlayMapViewController.swift */; platformFilters = (ios, ); }; - F2B385831A78B3EE16BFEA69 /* SnapshotterCoreGraphicsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77368780E4DBCCFB2CBD400 /* SnapshotterCoreGraphicsExample.swift */; platformFilters = (ios, ); }; - F476D12AC7B4347AA55BEC4C /* AnimateImageLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A471857797898860C3A8F685 /* AnimateImageLayerExample.swift */; platformFilters = (ios, ); }; - F48BF087BB56B0A44D8B16F3 /* PointAnnotationClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8359ECB5024BEF3722C3CA1 /* PointAnnotationClusteringExample.swift */; platformFilters = (ios, ); }; + EE4064D753E360A6A6AC5BAC /* CustomLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06955521CCC52B47AAB475F4 /* CustomLayerExample.swift */; platformFilter = ios; }; + F0502A1ACF0AED218F8184AB /* CarPlayMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6CEA9899CC0EC4F4381E19 /* CarPlayMapViewController.swift */; platformFilter = ios; }; + F2B385831A78B3EE16BFEA69 /* SnapshotterCoreGraphicsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77368780E4DBCCFB2CBD400 /* SnapshotterCoreGraphicsExample.swift */; platformFilter = ios; }; + F476D12AC7B4347AA55BEC4C /* AnimateImageLayerExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A471857797898860C3A8F685 /* AnimateImageLayerExample.swift */; platformFilter = ios; }; + F48BF087BB56B0A44D8B16F3 /* PointAnnotationClusteringExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8359ECB5024BEF3722C3CA1 /* PointAnnotationClusteringExample.swift */; platformFilter = ios; }; F492E2C8D35572B4CF48FE68 /* RasterParticleExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD7ADCCB774239AA0090C46 /* RasterParticleExample.swift */; }; - F5311222553DA118AC571D82 /* MultipleGeometriesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A7586D05B960928AB17A0D /* MultipleGeometriesExample.swift */; platformFilters = (ios, ); }; + F5311222553DA118AC571D82 /* MultipleGeometriesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A7586D05B960928AB17A0D /* MultipleGeometriesExample.swift */; platformFilter = ios; }; F5E96E5798947CA56FD77CF9 /* Fire_Hydrants.geojson in Resources */ = {isa = PBXBuildFile; fileRef = 02DA2CC04980F807255D646B /* Fire_Hydrants.geojson */; }; F613749DCDDDDC6F041032A0 /* SimpleMapExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78811E5A3185D2D32495870A /* SimpleMapExample.swift */; }; F6E3EF9BE4F1D2F58DE1BED2 /* radar1.gif in Resources */ = {isa = PBXBuildFile; fileRef = 8BD8BADE1108B0D380D9BEF8 /* radar1.gif */; }; FA077DC5A6CF295906536DF1 /* PrecipitationsExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDBCA79855B58FE84333124 /* PrecipitationsExample.swift */; }; FA53EEA88DB29D4D5AC58514 /* StandardInteractiveFeaturesExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FBAFDF929532EDB964786F4 /* StandardInteractiveFeaturesExample.swift */; }; - FDA4B57BE32D92BB57A5B7E6 /* FeaturesAtPointExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6239A5CDA61892902765B843 /* FeaturesAtPointExample.swift */; platformFilters = (ios, ); }; + FDA4B57BE32D92BB57A5B7E6 /* FeaturesAtPointExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6239A5CDA61892902765B843 /* FeaturesAtPointExample.swift */; platformFilter = ios; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -178,7 +179,7 @@ /* Begin PBXFileReference section */ 000D0E4CEFB6D5AF02518807 /* OfflineManagerExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = OfflineManagerExample.storyboard; sourceTree = ""; }; - 02DA2CC04980F807255D646B /* Fire_Hydrants.geojson */ = {isa = PBXFileReference; path = Fire_Hydrants.geojson; sourceTree = ""; }; + 02DA2CC04980F807255D646B /* Fire_Hydrants.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = Fire_Hydrants.geojson; sourceTree = ""; }; 06955521CCC52B47AAB475F4 /* CustomLayerExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomLayerExample.swift; sourceTree = ""; }; 083C452C7342E73F6F16A83C /* OfflineManagerExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineManagerExample.swift; sourceTree = ""; }; 0A5C0A3C44715B96D646ACB7 /* PitchAndDistanceExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PitchAndDistanceExample.swift; sourceTree = ""; }; @@ -204,7 +205,7 @@ 29DD4C2F0049E575A6B5BF66 /* ColorThemeExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorThemeExample.swift; sourceTree = ""; }; 2C957F9CA07061B793C2DD4A /* Custom3DPuckExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Custom3DPuckExample.swift; sourceTree = ""; }; 2D91A8B64951711546335530 /* VoiceOverAccessibilityExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceOverAccessibilityExample.swift; sourceTree = ""; }; - 2DD8B1D25297B7433F4AAF35 /* GradientLine.geojson */ = {isa = PBXFileReference; path = GradientLine.geojson; sourceTree = ""; }; + 2DD8B1D25297B7433F4AAF35 /* GradientLine.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = GradientLine.geojson; sourceTree = ""; }; 2F6B4718F05FB1E6736EA1FF /* CustomRasterSourceExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomRasterSourceExample.swift; sourceTree = ""; }; 3333EF3E0F1C789809F385AF /* DynamicViewAnnotationExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicViewAnnotationExample.swift; sourceTree = ""; }; 33E5647315A2357320BCF575 /* ViewAnnotationAnimationExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewAnnotationAnimationExample.swift; sourceTree = ""; }; @@ -219,7 +220,7 @@ 3F6F479FB7FFD90FA95F400E /* IconSizeChangeExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconSizeChangeExample.swift; sourceTree = ""; }; 3FB717239BBFE5103C1EB1A4 /* AdvancedViewportGesturesExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedViewportGesturesExample.swift; sourceTree = ""; }; 3FC5980DD30479F30127BA71 /* NavigationSimulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSimulator.swift; sourceTree = ""; }; - 450C8D5E4B84428FE51BCA97 /* route.geojson */ = {isa = PBXFileReference; path = route.geojson; sourceTree = ""; }; + 450C8D5E4B84428FE51BCA97 /* route.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = route.geojson; sourceTree = ""; }; 455C0B9F01316D0FF38ED62B /* CLLocationCoordinate2D+Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CLLocationCoordinate2D+Random.swift"; sourceTree = ""; }; 45B39AE24486FED5ED30392D /* LocationOverrideExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationOverrideExample.swift; sourceTree = ""; }; 46CE3D9C2873C0767DD76D85 /* ClusteringExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClusteringExample.swift; sourceTree = ""; }; @@ -252,6 +253,7 @@ 6E54D3F5943238258AA0A9BE /* ResizeMapViewExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResizeMapViewExample.swift; sourceTree = ""; }; 70922E748D003176C4A3C60A /* HeatmapLayerGlobeExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeatmapLayerGlobeExample.swift; sourceTree = ""; }; 7274E152F7FBB7894447F822 /* AnimateGeoJSONLineExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimateGeoJSONLineExample.swift; sourceTree = ""; }; + 73502E322D5D6544003B6A64 /* StandardStyleInteractionsExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardStyleInteractionsExample.swift; sourceTree = ""; }; 75D03F5A3A0E879717BFE421 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 7613C4E19DCD679A2620223C /* GeofencingPlayground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeofencingPlayground.swift; sourceTree = ""; }; 78811E5A3185D2D32495870A /* SimpleMapExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleMapExample.swift; sourceTree = ""; }; @@ -298,7 +300,7 @@ BE18E37A8652B4807D2459F1 /* ExamplesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamplesUITests.swift; sourceTree = ""; }; BFDBCA79855B58FE84333124 /* PrecipitationsExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrecipitationsExample.swift; sourceTree = ""; }; C0CC67084BA1191D0B179A94 /* PuckPlayground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PuckPlayground.swift; sourceTree = ""; }; - C47942F80A50166AC823012B /* sportcar.glb */ = {isa = PBXFileReference; path = sportcar.glb; sourceTree = ""; }; + C47942F80A50166AC823012B /* sportcar.glb */ = {isa = PBXFileReference; lastKnownFileType = file; path = sportcar.glb; sourceTree = ""; }; C61CC711054A032EE0446036 /* DynamicStylingExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicStylingExample.swift; sourceTree = ""; }; CB726A94B069761528B57EC8 /* ViewAnnotationWithPointAnnotationExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewAnnotationWithPointAnnotationExample.swift; sourceTree = ""; }; CBD8F852552CA316EFFCDD64 /* CalloutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalloutView.swift; sourceTree = ""; }; @@ -326,13 +328,13 @@ E97E057D9FFB1DE3E16F1F0B /* StandardInteractiveBuildingsExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardInteractiveBuildingsExample.swift; sourceTree = ""; }; EC1155178B21E2E8075454A8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; F000C4D3B6FC70FA9607E3A3 /* UIColor+Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Random.swift"; sourceTree = ""; }; - F033C8EFB89A90D6705B047D /* GeoJSONSourceExample.geojson */ = {isa = PBXFileReference; path = GeoJSONSourceExample.geojson; sourceTree = ""; }; + F033C8EFB89A90D6705B047D /* GeoJSONSourceExample.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = GeoJSONSourceExample.geojson; sourceTree = ""; }; F0A6063E57EC170F558A3F74 /* ExampleTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTableViewController.swift; sourceTree = ""; }; F0CE51977FA6E83B6F11BE5C /* Examples.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Examples.app; sourceTree = BUILT_PRODUCTS_DIR; }; F393DF039D7AD2F35C8DE4CE /* ViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewExtensions.swift; sourceTree = ""; }; F890746B56E20150A053B41B /* AnnotationsExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnotationsExample.swift; sourceTree = ""; }; FC1CEEE6277DEAD9FDFF4AAC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - FE2A263DD2E9DC52CEE356FA /* sf_airport_route.geojson */ = {isa = PBXFileReference; path = sf_airport_route.geojson; sourceTree = ""; }; + FE2A263DD2E9DC52CEE356FA /* sf_airport_route.geojson */ = {isa = PBXFileReference; lastKnownFileType = text; path = sf_airport_route.geojson; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -573,6 +575,7 @@ 588FD640D91E9DD366703F7B /* SnapshotterExample.swift */, 1A182413E535260335459F26 /* SpinningGlobeExample.swift */, 996964F634A4536F664C2611 /* StandardStyleExample.swift */, + 73502E322D5D6544003B6A64 /* StandardStyleInteractionsExample.swift */, 7F5E598A16FA446F583344CB /* TrackingModeExample.swift */, E0C19E67A2E87A3D18B7B511 /* ViewportExample.swift */, 2D91A8B64951711546335530 /* VoiceOverAccessibilityExample.swift */, @@ -932,6 +935,7 @@ 191391C51FC69A6D36EB67F0 /* ResizableImageExample.swift in Sources */, 86AED5DD9F8C8BB2C9736483 /* ResizeMapViewExample.swift in Sources */, CBD01BBA4E78796827A6E52D /* RuntimeSlotsExample.swift in Sources */, + 73502E332D5D654A003B6A64 /* StandardStyleInteractionsExample.swift in Sources */, 4791CACAC0846107E4B0955B /* SceneKitExample.swift in Sources */, F613749DCDDDDC6F041032A0 /* SimpleMapExample.swift in Sources */, 1F860D5B445E75772C4C3B6C /* SkyLayerExample.swift in Sources */, @@ -1007,7 +1011,12 @@ BUNDLE_LOADER = "$(TEST_HOST)"; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(PROJECT_DIR)/../lib"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "$(PROJECT_DIR)/../lib", + ); PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.MapboxTests; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; @@ -1117,7 +1126,12 @@ BUNDLE_LOADER = "$(TEST_HOST)"; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(PROJECT_DIR)/../lib"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "$(PROJECT_DIR)/../lib", + ); PRODUCT_BUNDLE_IDENTIFIER = mapbox.ExamplesUITests; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; @@ -1281,7 +1295,12 @@ BUNDLE_LOADER = "$(TEST_HOST)"; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(PROJECT_DIR)/../lib"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "$(PROJECT_DIR)/../lib", + ); PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.MapboxTests; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; @@ -1300,7 +1319,12 @@ BUNDLE_LOADER = "$(TEST_HOST)"; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(PROJECT_DIR)/../lib"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + "$(PROJECT_DIR)/../lib", + ); PRODUCT_BUNDLE_IDENTIFIER = mapbox.ExamplesUITests; SDKROOT = auto; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; diff --git a/Sources/Examples/All Examples/StandardStyleExample.swift b/Sources/Examples/All Examples/StandardStyleExample.swift index 2bae7b5758cb..5e4d288196ff 100644 --- a/Sources/Examples/All Examples/StandardStyleExample.swift +++ b/Sources/Examples/All Examples/StandardStyleExample.swift @@ -1,5 +1,5 @@ import UIKit -import MapboxMaps +@_spi(Experimental) import MapboxMaps final class StandardStyleExample: UIViewController, ExampleProtocol { private var mapView: MapView! @@ -7,6 +7,7 @@ final class StandardStyleExample: UIViewController, ExampleProtocol { private var lightPreset = StandardLightPreset.night private var labelsSetting = true private var showRealEstate = true + private var selectedPriceLabel: FeaturesetFeature? private var mapStyle: MapStyle { .standard( @@ -30,7 +31,7 @@ final class StandardStyleExample: UIViewController, ExampleProtocol { // When the style has finished loading add a line layer representing the border between New York and New Jersey mapView.mapboxMap.onStyleLoaded.observe { [weak self] _ in - guard let self else { return } + guard let self = self else { return } // Create and apply basic styling to the line layer, assign the layer to the "bottom" slot var layer = LineLayer(id: "line-layer", source: "line-layer") @@ -63,6 +64,33 @@ final class StandardStyleExample: UIViewController, ExampleProtocol { finish() }.store(in: &cancelables) + /// The contents of the imported style are private, meaning all the implementation details such as layers and sources are not accessible at runtime. + /// However the style defines a "hotels-price" featureset that represents a portion of features available for interaction. + /// Using the Interactions API you can add interactions to featuresets. + /// See `fragment-realestate-NY.json` for more information. + mapView.mapboxMap.addInteraction(TapInteraction(.featureset("hotels-price", importId: "real-estate-fragment")) { [weak self] priceLabel, _ in + guard let self = self else { return false } + /// Select a price label when it's clicked + self.selectedPriceLabel = priceLabel + + /// When there's a selected price label, we use it to set a feature state. + /// The `hidden` state is implemented in `fragment-realestate-NY.json` and hides the label and icon. + self.mapView.mapboxMap.setFeatureState(priceLabel, state: ["hidden": true]) + + self.updateViewAnnotation() + return true + }) + + /// An interaction without specified featureset handles all corresponding events that haven't been handled by other interactions. + mapView.mapboxMap.addInteraction(TapInteraction { [weak self] _ in + guard let self = self else { return false } + /// When the user taps the map outside of the price labels, deselect the latest selected label. + self.selectedPriceLabel = nil + self.mapView.mapboxMap.resetFeatureStates(featureset: .featureset("hotels-price", importId: "real-estate-fragment"), callback: nil) + self.updateViewAnnotation() + return true + }) + // Add buttons to control the light presets and labels let lightButton = changeLightButton() let labelsButton = changeLabelsButton() @@ -108,14 +136,67 @@ final class StandardStyleExample: UIViewController, ExampleProtocol { private func toggleRealEstate(isOn: Bool) { do { if isOn { - try mapView.mapboxMap.addStyleImport(withId: "real-estate", uri: StyleURI(url: styleURL)!) + try mapView.mapboxMap.addStyleImport(withId: "real-estate-fragment", uri: StyleURI(url: styleURL)!) } else { - try mapView.mapboxMap.removeStyleImport(withId: "real-estate") + try mapView.mapboxMap.removeStyleImport(withId: "real-estate-fragment") } } catch { print(error) } } + + private func updateViewAnnotation() { + mapView.viewAnnotations.removeAll() + + if let selectedPriceLabel = selectedPriceLabel, let coordinate = selectedPriceLabel.geometry.point?.coordinates { + let calloutView = createCalloutView(for: selectedPriceLabel) + let annotation = ViewAnnotation(coordinate: coordinate, view: calloutView) + annotation.variableAnchors = [.init(anchor: .bottom)] + mapView.viewAnnotations.add(annotation) + } + } + + private func createCalloutView(for feature: FeaturesetFeature) -> UIView { + let calloutView = UIView() + calloutView.backgroundColor = .white + calloutView.layer.cornerRadius = 8 + calloutView.layer.shadowColor = UIColor.black.cgColor + calloutView.layer.shadowOpacity = 0.2 + calloutView.layer.shadowOffset = CGSize(width: 0, height: 2) + calloutView.layer.shadowRadius = 4 + + let nameLabel = UILabel() + nameLabel.text = feature.name ?? "—" + nameLabel.font = UIFont.boldSystemFont(ofSize: 16) + nameLabel.translatesAutoresizingMaskIntoConstraints = false + + let priceLabel = UILabel() + priceLabel.text = feature.price ?? "—" + priceLabel.font = UIFont.systemFont(ofSize: 14) + priceLabel.textColor = .gray + priceLabel.translatesAutoresizingMaskIntoConstraints = false + + calloutView.addSubview(nameLabel) + calloutView.addSubview(priceLabel) + + NSLayoutConstraint.activate([ + nameLabel.topAnchor.constraint(equalTo: calloutView.topAnchor, constant: 8), + nameLabel.leadingAnchor.constraint(equalTo: calloutView.leadingAnchor, constant: 8), + nameLabel.trailingAnchor.constraint(equalTo: calloutView.trailingAnchor, constant: -8), + + priceLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 4), + priceLabel.leadingAnchor.constraint(equalTo: calloutView.leadingAnchor, constant: 8), + priceLabel.trailingAnchor.constraint(equalTo: calloutView.trailingAnchor, constant: -8), + priceLabel.bottomAnchor.constraint(equalTo: calloutView.bottomAnchor, constant: -8) + ]) + + return calloutView + } +} + +private extension FeaturesetFeature { + var price: String? { properties["price"]??.number.map { "$ \($0)" } } + var name: String? { properties["name"]??.string } } private let styleURL = Bundle.main.url(forResource: "fragment-realestate-NY", withExtension: "json")! diff --git a/Sources/Examples/All Examples/StandardStyleInteractionsExample.swift b/Sources/Examples/All Examples/StandardStyleInteractionsExample.swift new file mode 100644 index 000000000000..8c02cfa183a0 --- /dev/null +++ b/Sources/Examples/All Examples/StandardStyleInteractionsExample.swift @@ -0,0 +1,193 @@ +import UIKit +@_spi(Experimental) import MapboxMaps + +final class StandardStyleInteractionsExample: UIViewController, ExampleProtocol { + private var mapView: MapView! + private var cancelables = Set() + var lightPreset = StandardLightPreset.day + var theme = StandardTheme.default + var buildingSelectColor = StyleColor("hsl(214, 94%, 59%)") // default color + + override func viewDidLoad() { + super.viewDidLoad() + + let cameraCenter = CLLocationCoordinate2D(latitude: 60.1718, longitude: 24.9453) + let options = MapInitOptions(cameraOptions: CameraOptions(center: cameraCenter, zoom: 16.35, bearing: 49.92, pitch: 40)) + mapView = MapView(frame: view.bounds, mapInitOptions: options) + mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + /// DON'T USE Standard Experimental style in production, it will break over time. + /// Currently this feature is in preview. + mapView.mapboxMap.mapStyle = .standardExperimental() + + view.addSubview(mapView) + mapView.mapboxMap.onStyleLoaded.observe { [weak self] _ in + guard let self = self else { return } + self.setupInteractions() + finish() + }.store(in: &cancelables) + + // Add UI elements for debug panel + setupDebugPanel() + } + + private func setupInteractions() { + /// When a POI feature in the Standard POI featureset is tapped replace it with a ViewAnnotation + mapView.mapboxMap.addInteraction(TapInteraction(.standardPoi) { [weak self] poi, _ in + guard let self = self else { return false } + self.addViewAnnotation(for: poi) + self.mapView.mapboxMap.setFeatureState(poi, state: .init(hide: true)) + return true /// Returning true stops propagation to features below or the map itself. + }) + + /// When a building in the Standard Buildings featureset is tapped, set that building as selected to color it. + mapView.mapboxMap.addInteraction(TapInteraction(.standardBuildings) { [weak self] building, _ in + guard let self = self else { return false } + self.mapView.mapboxMap.setFeatureState(building, state: .init(select: true)) + return true + }) + + /// When a place label in the Standard Place Labels featureset is tapped, set that place label as selected. + mapView.mapboxMap.addInteraction(TapInteraction(.standardPlaceLabels) { [weak self] placeLabel, _ in + guard let self = self else { return false } + self.mapView.mapboxMap.setFeatureState(placeLabel, state: .init(select: true)) + return true + }) + + /// When the map is long-pressed, reset all selections + mapView.mapboxMap.addInteraction(LongPressInteraction { [weak self] _ in + guard let self = self else { return false } + self.mapView.mapboxMap.resetFeatureStates(featureset: .standardBuildings, callback: nil) + self.mapView.mapboxMap.resetFeatureStates(featureset: .standardPoi, callback: nil) + self.mapView.mapboxMap.resetFeatureStates(featureset: .standardPlaceLabels, callback: nil) + self.mapView.viewAnnotations.removeAll() + return true + }) + } + + private func addViewAnnotation(for poi: StandardPoiFeature) { + let view = UIImageView(image: UIImage(named: "intermediate-pin")) + view.contentMode = .scaleAspectFit + let annotation = ViewAnnotation(coordinate: poi.coordinate, view: view) + annotation.variableAnchors = [.init(anchor: .bottom, offsetY: 12)] + mapView.viewAnnotations.add(annotation) + } + + private func setupDebugPanel() { + let debugPanel = UIView() + debugPanel.translatesAutoresizingMaskIntoConstraints = false + debugPanel.backgroundColor = .white + debugPanel.layer.cornerRadius = 10 + debugPanel.layer.shadowColor = UIColor.black.cgColor + debugPanel.layer.shadowOpacity = 0.2 + debugPanel.layer.shadowOffset = CGSize(width: 0, height: 2) + debugPanel.layer.shadowRadius = 4 + view.addSubview(debugPanel) + + let buildingSelectLabel = UILabel() + buildingSelectLabel.text = "Building Select" + buildingSelectLabel.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(buildingSelectLabel) + + let buildingSelectControl = UISegmentedControl(items: ["Default", "Yellow", "Red"]) + buildingSelectControl.selectedSegmentIndex = 0 + buildingSelectControl.addTarget(self, action: #selector(buildingSelectColorChanged(_:)), for: .valueChanged) + buildingSelectControl.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(buildingSelectControl) + + let lightLabel = UILabel() + lightLabel.text = "Light" + lightLabel.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(lightLabel) + + let lightControl = UISegmentedControl(items: ["Dawn", "Day", "Dusk", "Night"]) + lightControl.selectedSegmentIndex = 1 + lightControl.addTarget(self, action: #selector(lightPresetChanged(_:)), for: .valueChanged) + lightControl.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(lightControl) + + let themeLabel = UILabel() + themeLabel.text = "Theme" + themeLabel.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(themeLabel) + + let themeControl = UISegmentedControl(items: ["Default", "Faded", "Monochrome"]) + themeControl.selectedSegmentIndex = 0 + themeControl.addTarget(self, action: #selector(themeChanged(_:)), for: .valueChanged) + themeControl.translatesAutoresizingMaskIntoConstraints = false + debugPanel.addSubview(themeControl) + + NSLayoutConstraint.activate([ + debugPanel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10), + debugPanel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10), + debugPanel.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10), + + buildingSelectLabel.topAnchor.constraint(equalTo: debugPanel.topAnchor, constant: 10), + buildingSelectLabel.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + + buildingSelectControl.topAnchor.constraint(equalTo: buildingSelectLabel.bottomAnchor, constant: 5), + buildingSelectControl.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + buildingSelectControl.trailingAnchor.constraint(equalTo: debugPanel.trailingAnchor, constant: -10), + + lightLabel.topAnchor.constraint(equalTo: buildingSelectControl.bottomAnchor, constant: 10), + lightLabel.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + + lightControl.topAnchor.constraint(equalTo: lightLabel.bottomAnchor, constant: 5), + lightControl.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + lightControl.trailingAnchor.constraint(equalTo: debugPanel.trailingAnchor, constant: -10), + + themeLabel.topAnchor.constraint(equalTo: lightControl.bottomAnchor, constant: 10), + themeLabel.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + + themeControl.topAnchor.constraint(equalTo: themeLabel.bottomAnchor, constant: 5), + themeControl.leadingAnchor.constraint(equalTo: debugPanel.leadingAnchor, constant: 10), + themeControl.trailingAnchor.constraint(equalTo: debugPanel.trailingAnchor, constant: -10), + + themeControl.bottomAnchor.constraint(equalTo: debugPanel.bottomAnchor, constant: -10) + ]) + } + + @objc private func buildingSelectColorChanged(_ sender: UISegmentedControl) { + switch sender.selectedSegmentIndex { + case 0: + buildingSelectColor = StyleColor("hsl(214, 94%, 59%)") + case 1: + buildingSelectColor = StyleColor("yellow") + case 2: + buildingSelectColor = StyleColor(.red) + default: + break + } + mapView.mapboxMap.mapStyle = .standardExperimental(theme: theme, lightPreset: lightPreset, buildingSelectColor: buildingSelectColor) + } + + @objc private func lightPresetChanged(_ sender: UISegmentedControl) { + switch sender.selectedSegmentIndex { + case 0: + lightPreset = .dawn + case 1: + lightPreset = .day + case 2: + lightPreset = .dusk + case 3: + lightPreset = .night + default: + break + } + mapView.mapboxMap.mapStyle = .standardExperimental(theme: theme, lightPreset: lightPreset, buildingSelectColor: buildingSelectColor) + } + + @objc private func themeChanged(_ sender: UISegmentedControl) { + switch sender.selectedSegmentIndex { + case 0: + theme = .default + case 1: + theme = .faded + case 2: + theme = .monochrome + default: + break + } + mapView.mapboxMap.mapStyle = .standardExperimental(theme: theme, lightPreset: lightPreset, buildingSelectColor: buildingSelectColor) + } +} diff --git a/Sources/Examples/Models/Examples.swift b/Sources/Examples/Models/Examples.swift index 2be0ad4b3c58..cb0abd7df89c 100644 --- a/Sources/Examples/Models/Examples.swift +++ b/Sources/Examples/Models/Examples.swift @@ -271,6 +271,9 @@ struct Examples { // Examples that show use cases related to user interaction with the map. static let userInteractionExamples: [Example] = .init { + Example(title: "Standard Style Interactions", + description: "Showcase of Standard style interactions.", + type: StandardStyleInteractionsExample.self) Example(title: "Find features at a point", description: "Query the map for rendered features belonging to a specific layer.", type: FeaturesAtPointExample.self) diff --git a/Sources/Examples/SwiftUI Examples/StandardInteractiveFeaturesExample.swift b/Sources/Examples/SwiftUI Examples/StandardInteractiveFeaturesExample.swift index cf4c8b6ea451..121e9284206a 100644 --- a/Sources/Examples/SwiftUI Examples/StandardInteractiveFeaturesExample.swift +++ b/Sources/Examples/SwiftUI Examples/StandardInteractiveFeaturesExample.swift @@ -21,72 +21,68 @@ struct StandardInteractiveFeaturesExample: View { var body: some View { let cameraCenter = CLLocationCoordinate2D(latitude: 60.1718, longitude: 24.9453) - MapReader { proxy in - Map(initialViewport: .camera(center: cameraCenter, zoom: 16.35, bearing: 49.92, pitch: 40)) { - if let selectedPoi { - /// When there is a currently selected poi: (1) display the PinView as a ViewAnnotation. - MapViewAnnotation(coordinate: selectedPoi.coordinate) { - PinView(text: selectedPoi.name ?? "", type: selectedPoi.class) - .id(selectedPoi.id) - } - .allowZElevate(true) - .variableAnchors([ - ViewAnnotationAnchorConfig(anchor: .top, offsetX: 0, offsetY: 50) - ]) + Map(initialViewport: .camera(center: cameraCenter, zoom: 16.35, bearing: 49.92, pitch: 40)) { + /// 1.) Add tap interactions targeting featuresets in the Mapbox Standard style - /// And (2): Hide the selected POI via feature state. - FeatureState(selectedPoi, .init(hide: true)) - } + /// When a POI feature in the Standard POI featureset is tapped, set that feature as selected. + TapInteraction(.standardPoi) { poi, _ in + selectedPoi = poi + return true /// Returning true stops propagation to features below or the map itself. + } - /// Each selected building is colored using the `selected` state. - ForEvery(selectedBuildings, id: \.id) { building in - FeatureState(building, .init(select: true)) - } + /// When a building in the Standard Buildings featureset is tapped, set that building as selected. + TapInteraction(.standardBuildings) { building, _ in + selectedBuildings.append(building) + return true + } - if let selectedPlace { - FeatureState(selectedPlace, .init(select: true)) - } + /// When a place label in the Standard Place Labels featureset is tapped, set that place label as selected + TapInteraction(.standardPlaceLabels) { placeLabel, _ in + selectedPlace = placeLabel + return true + } - /// When the POI featureset is tapped, set that feature as selected. - TapInteraction(.standardPoi) { poi, _ in - selectedPoi = poi + /// When the map is long-pressed, reset all selections + LongPressInteraction { _ in + selectedBuildings = [] + selectedPoi = nil + selectedPlace = nil + return true + } - /// Query all buildings in the viewport that are below the selected POI coordinate (distance between poi and building footprint <= 0). - proxy.map?.queryRenderedFeatures( - featureset: .standardBuildings, - filter: Exp(.lte) { - Exp(.distance) { poi.geometry.geoJSONObject } - 0 - }) { result in - switch result { - case .success(let features): - // TODO: MAPSIOS-1596 Fix crash in ForEvery for buildings with the same id. - self.selectedBuildings = features - case .failure(let failure): - print("error: \(failure)") - } - } - return true - } + /// 2.) Define behavior for POI, Building, and Place Label features when a user selects them - TapInteraction(.standardPlaceLabels) { placeLabel, _ in - selectedPlace = placeLabel - return true + /// Select POIs have the standard pin icon replaced by a more detailed icon. Additionally, information + /// about the POI is displayed in a box in the lower left corner + if let selectedPoi { + /// When there is a currently selected poi: (1) display the PinView as a ViewAnnotation. + MapViewAnnotation(coordinate: selectedPoi.coordinate) { + PinView(text: selectedPoi.name ?? "", type: selectedPoi.class) + .id(selectedPoi.id) } + .allowZElevate(true) + .variableAnchors([ + ViewAnnotationAnchorConfig(anchor: .top, offsetX: 0, offsetY: 50) + ]) + + /// And (2): Hide the selected POI via feature state. + FeatureState(selectedPoi, .init(hide: true)) + } - /// When the map is tapped, besides the feature, reset the selection. - TapInteraction { _ in - selectedBuildings = [] - selectedPoi = nil - selectedPlace = nil + /// Each selected building is colored using the `selected` state. + ForEvery(selectedBuildings, id: \.id) { building in + FeatureState(building, .init(select: true)) + } - return true - } + /// The selected label is colored and information about the place is displaed in the lower left corner + if let selectedPlace { + FeatureState(selectedPlace, .init(select: true)) } - /// DON'T USE Standard Experimental style in production, it will break over time. - /// Currently this feature is in preview. - .mapStyle(.standardExperimental(theme: theme, lightPreset: lightPreset, buildingSelectColor: buildingSelectColor)) } + + /// DON'T USE Standard Experimental style in production, it will break over time. + /// Currently this feature is in preview. + .mapStyle(.standardExperimental(theme: theme, lightPreset: lightPreset, buildingSelectColor: buildingSelectColor)) .ignoresSafeArea() /// Debug panel .overlay(alignment: .bottom) { diff --git a/Sources/Examples/SwiftUI Examples/StandardStyleImportExample.swift b/Sources/Examples/SwiftUI Examples/StandardStyleImportExample.swift index 98cfc74d2704..d363b9868e29 100644 --- a/Sources/Examples/SwiftUI Examples/StandardStyleImportExample.swift +++ b/Sources/Examples/SwiftUI Examples/StandardStyleImportExample.swift @@ -28,7 +28,7 @@ struct StandardStyleImportExample: View { return true } - /// An interaction without specified featureset handles all corresponding events that were haven't been handled by other interactions. + /// An interaction without specified featureset handles all corresponding events that haven't been handled by other interactions. TapInteraction { _ in /// When the user taps the map outside of the price labels, deselect the latest selected label. selectedPriceLabel = nil