diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index d907f0d..18b1488 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 07DDEB3EBEEC4C6FAF715BF1 /* libPods-DemoTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 98DB4ADA533041DD9D9E7647 /* libPods-DemoTests.a */; }; 273E9EE865984F44A8AF2A9D /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2957D8BD1FB4630AD6F922F /* libPods.a */; }; + 3C7F86CD18CE609200F7091A /* NATiledImageDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C7F86CC18CE609200F7091A /* NATiledImageDemoViewController.m */; }; + 3C990C8518CF60FB00BF4C44 /* NATiledImageMapViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C990C8418CF60FB00BF4C44 /* NATiledImageMapViewControllerTests.m */; }; 3C9F354518CA838600EA1F22 /* NAMasterViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9F354418CA838600EA1F22 /* NAMasterViewControllerTests.m */; }; 3C9F354718CA862100EA1F22 /* NAPinAnnotationsDemoViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9F354618CA862100EA1F22 /* NAPinAnnotationsDemoViewControllerTests.m */; }; 3C9F354918CA86D600EA1F22 /* NAInteractiveDemoViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C9F354818CA86D600EA1F22 /* NAInteractiveDemoViewControllerTests.m */; }; @@ -49,6 +51,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 3C7F86CB18CE609200F7091A /* NATiledImageDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NATiledImageDemoViewController.h; sourceTree = ""; }; + 3C7F86CC18CE609200F7091A /* NATiledImageDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NATiledImageDemoViewController.m; sourceTree = ""; }; + 3C990C8418CF60FB00BF4C44 /* NATiledImageMapViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NATiledImageMapViewControllerTests.m; sourceTree = ""; }; 3C9F354418CA838600EA1F22 /* NAMasterViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NAMasterViewControllerTests.m; sourceTree = ""; }; 3C9F354618CA862100EA1F22 /* NAPinAnnotationsDemoViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NAPinAnnotationsDemoViewControllerTests.m; sourceTree = ""; }; 3C9F354818CA86D600EA1F22 /* NAInteractiveDemoViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NAInteractiveDemoViewControllerTests.m; sourceTree = ""; }; @@ -176,6 +181,8 @@ 3CB0E6DD18C8B9E2009CE8DB /* Supporting Files */, 3C9F354C18CA922C00EA1F22 /* NAAnnotationDemoViewController.h */, 3C9F354D18CA922C00EA1F22 /* NAAnnotationDemoViewController.m */, + 3C7F86CB18CE609200F7091A /* NATiledImageDemoViewController.h */, + 3C7F86CC18CE609200F7091A /* NATiledImageDemoViewController.m */, ); path = Demo; sourceTree = ""; @@ -201,6 +208,7 @@ 3C9F354818CA86D600EA1F22 /* NAInteractiveDemoViewControllerTests.m */, 3C9F354A18CA876700EA1F22 /* NALoadViaNIBDemoViewControllerTests.m */, 3C9F354F18CB8B6000EA1F22 /* NAAnnotationDemoViewControllerTests.m */, + 3C990C8418CF60FB00BF4C44 /* NATiledImageMapViewControllerTests.m */, ); path = DemoTests; sourceTree = ""; @@ -389,6 +397,7 @@ 3CB0E71C18C8BB08009CE8DB /* NAAppDelegate.m in Sources */, 3CB0E71B18C8BB08009CE8DB /* NAAnimatedDemoViewController.m in Sources */, 3C9F354E18CA922C00EA1F22 /* NAAnnotationDemoViewController.m in Sources */, + 3C7F86CD18CE609200F7091A /* NATiledImageDemoViewController.m in Sources */, 3CB0E72018C8BB08009CE8DB /* NALoadViaNIBDemoViewController.m in Sources */, 3CB0E71D18C8BB08009CE8DB /* NAPinAnnotationsDemoViewController.m in Sources */, ); @@ -402,6 +411,7 @@ 3CB0E72F18C8C9A4009CE8DB /* NAMapViewTests.m in Sources */, 3C9F354918CA86D600EA1F22 /* NAInteractiveDemoViewControllerTests.m in Sources */, 3C9F354718CA862100EA1F22 /* NAPinAnnotationsDemoViewControllerTests.m in Sources */, + 3C990C8518CF60FB00BF4C44 /* NATiledImageMapViewControllerTests.m in Sources */, 3C9F354518CA838600EA1F22 /* NAMasterViewControllerTests.m in Sources */, 3C9F354B18CA876700EA1F22 /* NALoadViaNIBDemoViewControllerTests.m in Sources */, ); @@ -523,6 +533,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Demo/Demo-Prefix.pch"; INFOPLIST_FILE = "Demo/Demo-Info.plist"; @@ -537,6 +551,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Demo/Demo-Prefix.pch"; INFOPLIST_FILE = "Demo/Demo-Info.plist"; diff --git a/Demo/Demo/NAAnnotationDemoViewController.m b/Demo/Demo/NAAnnotationDemoViewController.m index 25317b9..9ff7810 100644 --- a/Demo/Demo/NAAnnotationDemoViewController.m +++ b/Demo/Demo/NAAnnotationDemoViewController.m @@ -32,10 +32,10 @@ - (void)viewDidLoad [mapView addAnnotation:melbourne animated:NO]; NAAnnotation *perth = [NAAnnotation annotationWithPoint:CGPointMake(63.0f, 379.0f)]; - [mapView addAnnotation:perth animated:YES]; + [mapView addAnnotation:perth animated:YES]; NAAnnotation *brisbane = [NAAnnotation annotationWithPoint:CGPointMake(679.0f, 302.0f)]; - [mapView addAnnotation:brisbane animated:NO]; + [mapView addAnnotation:brisbane animated:NO]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation diff --git a/Demo/Demo/NAMasterViewController.m b/Demo/Demo/NAMasterViewController.m index fdf7ad5..848477f 100644 --- a/Demo/Demo/NAMasterViewController.m +++ b/Demo/Demo/NAMasterViewController.m @@ -12,6 +12,7 @@ #import "NALoadViaNIBDemoViewController.h" #import "NAAnimatedDemoViewController.h" #import "NAInteractiveDemoViewController.h" +#import "NATiledImageDemoViewController.h" @implementation NAMasterViewController @@ -37,7 +38,7 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ - return 5; + return 6; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath @@ -66,6 +67,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N case 4: cell.textLabel.text = @"Interactive Demo"; break; + case 5: + cell.textLabel.text = @"Tiled Map Demo"; + break; default: cell.textLabel.text = @"???"; break; @@ -79,33 +83,22 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath if(indexPath.row == 0){ NAAnnotationDemoViewController *vc = [[NAAnnotationDemoViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:vc animated:YES]; - return; - } - - if(indexPath.row == 1){ + } else if(indexPath.row == 1){ NAPinAnnotationsDemoViewController *vc = [[NAPinAnnotationsDemoViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:vc animated:YES]; - return; - } - - if(indexPath.row == 2){ + } else if (indexPath.row == 2){ NALoadViaNIBDemoViewController *vc = [[NALoadViaNIBDemoViewController alloc] initWithNibName:@"NALoadViaNIBDemoViewController" bundle:nil]; [self.navigationController pushViewController:vc animated:YES]; - return; - } - - if(indexPath.row == 3){ + } else if (indexPath.row == 3){ NAAnimatedDemoViewController *vc = [[NAAnimatedDemoViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:vc animated:YES]; - return; - } - - if(indexPath.row == 4){ + } else if (indexPath.row == 4){ NAInteractiveDemoViewController *vc = [[NAInteractiveDemoViewController alloc] initWithNibName:@"NAInteractiveDemoViewController" bundle:nil]; [self.navigationController pushViewController:vc animated:YES]; - return; + } else if (indexPath.row == 5){ + NATiledImageDemoViewController *vc = [[NATiledImageDemoViewController alloc] initWithNibName:nil bundle:nil]; + [self.navigationController pushViewController:vc animated:YES]; } - } @end diff --git a/Demo/Demo/NAPinAnnotationsDemoViewController.m b/Demo/Demo/NAPinAnnotationsDemoViewController.m index 2d109f0..c72d6ca 100644 --- a/Demo/Demo/NAPinAnnotationsDemoViewController.m +++ b/Demo/Demo/NAPinAnnotationsDemoViewController.m @@ -11,21 +11,8 @@ #import "NAPinAnnotationMapView.h" #import "NAPinAnnotation.h" -@interface NAPinAnnotationsDemoViewController () - -@end - @implementation NAPinAnnotationsDemoViewController -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization - } - return self; -} - - (void)viewDidLoad { [super viewDidLoad]; diff --git a/Demo/Demo/NATiledImageDemoViewController.h b/Demo/Demo/NATiledImageDemoViewController.h new file mode 100644 index 0000000..d715e1e --- /dev/null +++ b/Demo/Demo/NATiledImageDemoViewController.h @@ -0,0 +1,12 @@ +// +// NATiledImageDemoViewController.h +// +// Created by Daniel Doubrovkine on 3/10/14. +// Copyright (c) 2014 neilang.com. All rights reserved. +// + +#import + +@interface NATiledImageDemoViewController : UIViewController + +@end diff --git a/Demo/Demo/NATiledImageDemoViewController.m b/Demo/Demo/NATiledImageDemoViewController.m new file mode 100644 index 0000000..7011e75 --- /dev/null +++ b/Demo/Demo/NATiledImageDemoViewController.m @@ -0,0 +1,58 @@ +// +// NATiledImageDemoViewController.m +// Demo +// +// Created by Daniel Doubrovkine on 3/10/14. +// Copyright (c) 2014 neilang.com. All rights reserved. +// + +#import "NATiledImageDemoViewController.h" +#import "NATiledImageMapView.h" +#import "NADZTileImageDataSource.h" + +@interface NATiledImageDemoViewController () +@property(nonatomic, readonly) NATiledImageMapView *mapView; +@end + +@implementation NATiledImageDemoViewController + +-(void)viewDidLoad +{ + [super viewDidLoad]; + + NADZTileImageDataSource *dzTileImageDataSource = [[NADZTileImageDataSource alloc] init]; + dzTileImageDataSource.maxTiledHeight = 5389; + dzTileImageDataSource.maxTiledWidth = 5000; + dzTileImageDataSource.minTileLevel = 11; + dzTileImageDataSource.maxTileLevel = ceil(log(MAX(dzTileImageDataSource.maxTiledWidth, dzTileImageDataSource.maxTiledHeight))/log(2)); + dzTileImageDataSource.tileSize = 512; + dzTileImageDataSource.tileFormat = @"jpg"; + dzTileImageDataSource.tileBaseURL = [NSURL URLWithString:@"https://raw.github.com/dblock/NAMapKit/tiled-map-view/Demo/Maps/Armory2014/tiles"]; + + NATiledImageMapView *mapView = [[NATiledImageMapView alloc] initWithFrame:self.view.bounds tiledImageDataSource:dzTileImageDataSource]; + mapView.backgroundColor = [UIColor colorWithRed:0.000f green:0.475f blue:0.761f alpha:1.000f]; + mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + // mapView.displayTileBorders = YES; + mapView.backgroundImageURL = [NSURL URLWithString:@"https://raw.github.com/dblock/NAMapKit/tiled-map-view/Demo/Maps/Armory2014/large.jpg"]; + _mapView = mapView; + + [self.view addSubview:mapView]; + + NAAnnotation *champagneBar = [NAAnnotation annotationWithPoint:[mapView coordinateFor:CGPointMake(0.30f, 0.10f)]]; + [mapView addAnnotation:champagneBar animated:NO]; + + NAAnnotation *artsyBooth = [NAAnnotation annotationWithPoint:[mapView coordinateFor:CGPointMake(0.53f, 0.83f)]]; + [mapView addAnnotation:artsyBooth animated:NO]; +} + +-(void)viewDidAppear:(BOOL)animated +{ + [self.mapView zoomToFit:animated]; +} + +-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +@end diff --git a/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m b/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m index 5377fbc..76867de 100644 --- a/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m +++ b/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m @@ -10,7 +10,9 @@ SpecBegin(NAAnnotationDemoViewController) -setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); it(@"displays map with a pin", ^{ NAAnnotationDemoViewController *vc = [[NAAnnotationDemoViewController alloc] init]; diff --git a/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m b/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m index 20f9ac9..bd3830d 100644 --- a/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m +++ b/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m @@ -10,7 +10,9 @@ SpecBegin(NAInteractiveDemoViewController) -setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); __block NAInteractiveDemoViewController *vc = nil; @@ -26,7 +28,7 @@ it(@"adds a pin", ^{ [vc addPinAt:CGPointMake(100, 200) withColor:NAPinColorRed]; expect(vc.view).to.haveValidSnapshotNamed(@"add"); - + }); it(@"removes a pin", ^{ diff --git a/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m b/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m index c7bb549..37e8983 100644 --- a/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m +++ b/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m @@ -10,7 +10,9 @@ SpecBegin(NALoadViaNIBDemoViewController) -setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); it(@"displays a menu", ^{ NALoadViaNIBDemoViewController *vc = [[NALoadViaNIBDemoViewController alloc] init]; diff --git a/Demo/DemoTests/NAMasterViewControllerTests.m b/Demo/DemoTests/NAMasterViewControllerTests.m index 1b2d8a1..1af6fe7 100644 --- a/Demo/DemoTests/NAMasterViewControllerTests.m +++ b/Demo/DemoTests/NAMasterViewControllerTests.m @@ -10,7 +10,9 @@ SpecBegin(NAMasterViewController) -setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); it(@"displays the master menu", ^{ NAMasterViewController *vc = [[NAMasterViewController alloc] initWithNibName:@"NAMasterViewController" bundle:nil]; diff --git a/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m b/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m index 955f026..7b776ad 100644 --- a/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m +++ b/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m @@ -11,7 +11,9 @@ SpecBegin(NAPinAnnotationsDemoViewController) -setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); __block NAPinAnnotationsDemoViewController *vc = nil; diff --git a/Demo/DemoTests/NATiledImageMapViewControllerTests.m b/Demo/DemoTests/NATiledImageMapViewControllerTests.m new file mode 100644 index 0000000..414ff82 --- /dev/null +++ b/Demo/DemoTests/NATiledImageMapViewControllerTests.m @@ -0,0 +1,29 @@ +// +// NATiledImageMapViewTests.m +// +// Created by Daniel Doubrovkine on 3/11/14. +// Copyright (c) 2014 neilang.com. All rights reserved. +// + +#import "NATiledImageDemoViewController.h" + +SpecBegin(NATiledImageDemoViewController) + +beforeAll(^{ + setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR); +}); + +__block NATiledImageDemoViewController *vc = nil; + +beforeEach(^{ + vc = [[NATiledImageDemoViewController alloc] init]; + expect(vc.view).willNot.beNil(); +}); + +// TODO: drawRect isn't called when running in a test until the test has finished +pending(@"displays map with a pin", ^{ + [vc viewDidAppear:NO]; + expect(vc.view).to.haveValidSnapshotNamed(@"default"); +}); + +SpecEnd diff --git a/Demo/DemoTests/ReferenceImages/NAAnnotationDemoViewControllerSpec/default@2x.png b/Demo/DemoTests/ReferenceImages/NAAnnotationDemoViewControllerSpec/default@2x.png index c74ba1c..67c38f9 100644 Binary files a/Demo/DemoTests/ReferenceImages/NAAnnotationDemoViewControllerSpec/default@2x.png and b/Demo/DemoTests/ReferenceImages/NAAnnotationDemoViewControllerSpec/default@2x.png differ diff --git a/Demo/DemoTests/ReferenceImages/NAMasterViewControllerSpec/default@2x.png b/Demo/DemoTests/ReferenceImages/NAMasterViewControllerSpec/default@2x.png index 43c27d0..657ca14 100644 Binary files a/Demo/DemoTests/ReferenceImages/NAMasterViewControllerSpec/default@2x.png and b/Demo/DemoTests/ReferenceImages/NAMasterViewControllerSpec/default@2x.png differ diff --git a/Demo/DemoTests/ReferenceImages/NAPinAnnotationsDemoViewControllerSpec/default@2x.png b/Demo/DemoTests/ReferenceImages/NAPinAnnotationsDemoViewControllerSpec/default@2x.png index e317791..73d70a1 100644 Binary files a/Demo/DemoTests/ReferenceImages/NAPinAnnotationsDemoViewControllerSpec/default@2x.png and b/Demo/DemoTests/ReferenceImages/NAPinAnnotationsDemoViewControllerSpec/default@2x.png differ diff --git a/Demo/Maps/Armory2014/large.jpg b/Demo/Maps/Armory2014/large.jpg new file mode 100644 index 0000000..0e41f51 Binary files /dev/null and b/Demo/Maps/Armory2014/large.jpg differ diff --git a/Demo/Maps/Armory2014/original.jpg b/Demo/Maps/Armory2014/original.jpg new file mode 100644 index 0000000..c576142 Binary files /dev/null and b/Demo/Maps/Armory2014/original.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/0_0.jpg b/Demo/Maps/Armory2014/tiles/11/0_0.jpg new file mode 100644 index 0000000..4562e5c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/0_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/0_1.jpg b/Demo/Maps/Armory2014/tiles/11/0_1.jpg new file mode 100644 index 0000000..d566279 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/0_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/0_2.jpg b/Demo/Maps/Armory2014/tiles/11/0_2.jpg new file mode 100644 index 0000000..5ca016a Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/0_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/1_0.jpg b/Demo/Maps/Armory2014/tiles/11/1_0.jpg new file mode 100644 index 0000000..af06fa7 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/1_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/1_1.jpg b/Demo/Maps/Armory2014/tiles/11/1_1.jpg new file mode 100644 index 0000000..9579447 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/1_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/1_2.jpg b/Demo/Maps/Armory2014/tiles/11/1_2.jpg new file mode 100644 index 0000000..0dcb952 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/1_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/2_0.jpg b/Demo/Maps/Armory2014/tiles/11/2_0.jpg new file mode 100644 index 0000000..2037125 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/2_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/2_1.jpg b/Demo/Maps/Armory2014/tiles/11/2_1.jpg new file mode 100644 index 0000000..c31d253 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/2_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/11/2_2.jpg b/Demo/Maps/Armory2014/tiles/11/2_2.jpg new file mode 100644 index 0000000..3fe929b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/11/2_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_0.jpg b/Demo/Maps/Armory2014/tiles/12/0_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_1.jpg b/Demo/Maps/Armory2014/tiles/12/0_1.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_2.jpg b/Demo/Maps/Armory2014/tiles/12/0_2.jpg new file mode 100644 index 0000000..511c51b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_3.jpg b/Demo/Maps/Armory2014/tiles/12/0_3.jpg new file mode 100644 index 0000000..f268dde Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_4.jpg b/Demo/Maps/Armory2014/tiles/12/0_4.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/0_5.jpg b/Demo/Maps/Armory2014/tiles/12/0_5.jpg new file mode 100644 index 0000000..5405722 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/0_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_0.jpg b/Demo/Maps/Armory2014/tiles/12/1_0.jpg new file mode 100644 index 0000000..6093d95 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_1.jpg b/Demo/Maps/Armory2014/tiles/12/1_1.jpg new file mode 100644 index 0000000..d7a431f Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_2.jpg b/Demo/Maps/Armory2014/tiles/12/1_2.jpg new file mode 100644 index 0000000..8e5498e Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_3.jpg b/Demo/Maps/Armory2014/tiles/12/1_3.jpg new file mode 100644 index 0000000..3159b2c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_4.jpg b/Demo/Maps/Armory2014/tiles/12/1_4.jpg new file mode 100644 index 0000000..c32919d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/1_5.jpg b/Demo/Maps/Armory2014/tiles/12/1_5.jpg new file mode 100644 index 0000000..7c1b3d5 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/1_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_0.jpg b/Demo/Maps/Armory2014/tiles/12/2_0.jpg new file mode 100644 index 0000000..89ed34c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_1.jpg b/Demo/Maps/Armory2014/tiles/12/2_1.jpg new file mode 100644 index 0000000..191f63a Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_2.jpg b/Demo/Maps/Armory2014/tiles/12/2_2.jpg new file mode 100644 index 0000000..bc53fe7 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_3.jpg b/Demo/Maps/Armory2014/tiles/12/2_3.jpg new file mode 100644 index 0000000..38b9c0f Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_4.jpg b/Demo/Maps/Armory2014/tiles/12/2_4.jpg new file mode 100644 index 0000000..eb36ff5 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/2_5.jpg b/Demo/Maps/Armory2014/tiles/12/2_5.jpg new file mode 100644 index 0000000..98e49ca Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/2_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_0.jpg b/Demo/Maps/Armory2014/tiles/12/3_0.jpg new file mode 100644 index 0000000..5348ea2 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_1.jpg b/Demo/Maps/Armory2014/tiles/12/3_1.jpg new file mode 100644 index 0000000..71319ba Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_2.jpg b/Demo/Maps/Armory2014/tiles/12/3_2.jpg new file mode 100644 index 0000000..1e7362c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_3.jpg b/Demo/Maps/Armory2014/tiles/12/3_3.jpg new file mode 100644 index 0000000..18330f7 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_4.jpg b/Demo/Maps/Armory2014/tiles/12/3_4.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/3_5.jpg b/Demo/Maps/Armory2014/tiles/12/3_5.jpg new file mode 100644 index 0000000..98e49ca Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/3_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_0.jpg b/Demo/Maps/Armory2014/tiles/12/4_0.jpg new file mode 100644 index 0000000..d71d3a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_1.jpg b/Demo/Maps/Armory2014/tiles/12/4_1.jpg new file mode 100644 index 0000000..ba3ff66 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_2.jpg b/Demo/Maps/Armory2014/tiles/12/4_2.jpg new file mode 100644 index 0000000..f07284b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_3.jpg b/Demo/Maps/Armory2014/tiles/12/4_3.jpg new file mode 100644 index 0000000..d71d3a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_4.jpg b/Demo/Maps/Armory2014/tiles/12/4_4.jpg new file mode 100644 index 0000000..d71d3a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/12/4_5.jpg b/Demo/Maps/Armory2014/tiles/12/4_5.jpg new file mode 100644 index 0000000..8255ee1 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/12/4_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_0.jpg b/Demo/Maps/Armory2014/tiles/13/0_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_1.jpg b/Demo/Maps/Armory2014/tiles/13/0_1.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_10.jpg b/Demo/Maps/Armory2014/tiles/13/0_10.jpg new file mode 100644 index 0000000..dc2413d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_2.jpg b/Demo/Maps/Armory2014/tiles/13/0_2.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_3.jpg b/Demo/Maps/Armory2014/tiles/13/0_3.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_4.jpg b/Demo/Maps/Armory2014/tiles/13/0_4.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_5.jpg b/Demo/Maps/Armory2014/tiles/13/0_5.jpg new file mode 100644 index 0000000..c6e609e Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_6.jpg b/Demo/Maps/Armory2014/tiles/13/0_6.jpg new file mode 100644 index 0000000..7aeb088 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_7.jpg b/Demo/Maps/Armory2014/tiles/13/0_7.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_8.jpg b/Demo/Maps/Armory2014/tiles/13/0_8.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/0_9.jpg b/Demo/Maps/Armory2014/tiles/13/0_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/0_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_0.jpg b/Demo/Maps/Armory2014/tiles/13/1_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_1.jpg b/Demo/Maps/Armory2014/tiles/13/1_1.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_10.jpg b/Demo/Maps/Armory2014/tiles/13/1_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_2.jpg b/Demo/Maps/Armory2014/tiles/13/1_2.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_3.jpg b/Demo/Maps/Armory2014/tiles/13/1_3.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_4.jpg b/Demo/Maps/Armory2014/tiles/13/1_4.jpg new file mode 100644 index 0000000..85198db Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_5.jpg b/Demo/Maps/Armory2014/tiles/13/1_5.jpg new file mode 100644 index 0000000..0df6cc6 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_6.jpg b/Demo/Maps/Armory2014/tiles/13/1_6.jpg new file mode 100644 index 0000000..336f553 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_7.jpg b/Demo/Maps/Armory2014/tiles/13/1_7.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_8.jpg b/Demo/Maps/Armory2014/tiles/13/1_8.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/1_9.jpg b/Demo/Maps/Armory2014/tiles/13/1_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/1_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_0.jpg b/Demo/Maps/Armory2014/tiles/13/2_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_1.jpg b/Demo/Maps/Armory2014/tiles/13/2_1.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_10.jpg b/Demo/Maps/Armory2014/tiles/13/2_10.jpg new file mode 100644 index 0000000..a73c848 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_2.jpg b/Demo/Maps/Armory2014/tiles/13/2_2.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_3.jpg b/Demo/Maps/Armory2014/tiles/13/2_3.jpg new file mode 100644 index 0000000..3a81929 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_4.jpg b/Demo/Maps/Armory2014/tiles/13/2_4.jpg new file mode 100644 index 0000000..61612ac Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_5.jpg b/Demo/Maps/Armory2014/tiles/13/2_5.jpg new file mode 100644 index 0000000..0e3befc Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_6.jpg b/Demo/Maps/Armory2014/tiles/13/2_6.jpg new file mode 100644 index 0000000..46039c3 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_7.jpg b/Demo/Maps/Armory2014/tiles/13/2_7.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_8.jpg b/Demo/Maps/Armory2014/tiles/13/2_8.jpg new file mode 100644 index 0000000..9e6c369 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/2_9.jpg b/Demo/Maps/Armory2014/tiles/13/2_9.jpg new file mode 100644 index 0000000..ff0eb03 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/2_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_0.jpg b/Demo/Maps/Armory2014/tiles/13/3_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_1.jpg b/Demo/Maps/Armory2014/tiles/13/3_1.jpg new file mode 100644 index 0000000..0e44374 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_10.jpg b/Demo/Maps/Armory2014/tiles/13/3_10.jpg new file mode 100644 index 0000000..2dea375 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_2.jpg b/Demo/Maps/Armory2014/tiles/13/3_2.jpg new file mode 100644 index 0000000..324de13 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_3.jpg b/Demo/Maps/Armory2014/tiles/13/3_3.jpg new file mode 100644 index 0000000..9672f42 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_4.jpg b/Demo/Maps/Armory2014/tiles/13/3_4.jpg new file mode 100644 index 0000000..c2311f8 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_5.jpg b/Demo/Maps/Armory2014/tiles/13/3_5.jpg new file mode 100644 index 0000000..6bff1bc Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_6.jpg b/Demo/Maps/Armory2014/tiles/13/3_6.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_7.jpg b/Demo/Maps/Armory2014/tiles/13/3_7.jpg new file mode 100644 index 0000000..1ff3cb5 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_8.jpg b/Demo/Maps/Armory2014/tiles/13/3_8.jpg new file mode 100644 index 0000000..d2139f5 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/3_9.jpg b/Demo/Maps/Armory2014/tiles/13/3_9.jpg new file mode 100644 index 0000000..aea37fa Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/3_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_0.jpg b/Demo/Maps/Armory2014/tiles/13/4_0.jpg new file mode 100644 index 0000000..c887ff8 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_1.jpg b/Demo/Maps/Armory2014/tiles/13/4_1.jpg new file mode 100644 index 0000000..c2e886c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_10.jpg b/Demo/Maps/Armory2014/tiles/13/4_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_2.jpg b/Demo/Maps/Armory2014/tiles/13/4_2.jpg new file mode 100644 index 0000000..7dd5520 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_3.jpg b/Demo/Maps/Armory2014/tiles/13/4_3.jpg new file mode 100644 index 0000000..a6a4281 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_4.jpg b/Demo/Maps/Armory2014/tiles/13/4_4.jpg new file mode 100644 index 0000000..07744a3 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_5.jpg b/Demo/Maps/Armory2014/tiles/13/4_5.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_6.jpg b/Demo/Maps/Armory2014/tiles/13/4_6.jpg new file mode 100644 index 0000000..a286ec9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_7.jpg b/Demo/Maps/Armory2014/tiles/13/4_7.jpg new file mode 100644 index 0000000..2d242cf Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_8.jpg b/Demo/Maps/Armory2014/tiles/13/4_8.jpg new file mode 100644 index 0000000..589b6c3 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/4_9.jpg b/Demo/Maps/Armory2014/tiles/13/4_9.jpg new file mode 100644 index 0000000..34b3981 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/4_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_0.jpg b/Demo/Maps/Armory2014/tiles/13/5_0.jpg new file mode 100644 index 0000000..45226d3 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_1.jpg b/Demo/Maps/Armory2014/tiles/13/5_1.jpg new file mode 100644 index 0000000..7e21c7d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_10.jpg b/Demo/Maps/Armory2014/tiles/13/5_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_2.jpg b/Demo/Maps/Armory2014/tiles/13/5_2.jpg new file mode 100644 index 0000000..435dbf4 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_3.jpg b/Demo/Maps/Armory2014/tiles/13/5_3.jpg new file mode 100644 index 0000000..a002ca5 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_4.jpg b/Demo/Maps/Armory2014/tiles/13/5_4.jpg new file mode 100644 index 0000000..e9406db Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_5.jpg b/Demo/Maps/Armory2014/tiles/13/5_5.jpg new file mode 100644 index 0000000..2d768a0 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_6.jpg b/Demo/Maps/Armory2014/tiles/13/5_6.jpg new file mode 100644 index 0000000..a2ae712 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_7.jpg b/Demo/Maps/Armory2014/tiles/13/5_7.jpg new file mode 100644 index 0000000..5f561ce Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_8.jpg b/Demo/Maps/Armory2014/tiles/13/5_8.jpg new file mode 100644 index 0000000..991223f Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/5_9.jpg b/Demo/Maps/Armory2014/tiles/13/5_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/5_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_0.jpg b/Demo/Maps/Armory2014/tiles/13/6_0.jpg new file mode 100644 index 0000000..2c0f185 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_1.jpg b/Demo/Maps/Armory2014/tiles/13/6_1.jpg new file mode 100644 index 0000000..a3c42fe Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_10.jpg b/Demo/Maps/Armory2014/tiles/13/6_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_2.jpg b/Demo/Maps/Armory2014/tiles/13/6_2.jpg new file mode 100644 index 0000000..3a1e09b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_3.jpg b/Demo/Maps/Armory2014/tiles/13/6_3.jpg new file mode 100644 index 0000000..bd3b4e8 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_4.jpg b/Demo/Maps/Armory2014/tiles/13/6_4.jpg new file mode 100644 index 0000000..ee50b3d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_5.jpg b/Demo/Maps/Armory2014/tiles/13/6_5.jpg new file mode 100644 index 0000000..0345985 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_6.jpg b/Demo/Maps/Armory2014/tiles/13/6_6.jpg new file mode 100644 index 0000000..1b1aadc Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_7.jpg b/Demo/Maps/Armory2014/tiles/13/6_7.jpg new file mode 100644 index 0000000..d131e4e Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_8.jpg b/Demo/Maps/Armory2014/tiles/13/6_8.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/6_9.jpg b/Demo/Maps/Armory2014/tiles/13/6_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/6_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_0.jpg b/Demo/Maps/Armory2014/tiles/13/7_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_1.jpg b/Demo/Maps/Armory2014/tiles/13/7_1.jpg new file mode 100644 index 0000000..6084a89 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_10.jpg b/Demo/Maps/Armory2014/tiles/13/7_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_2.jpg b/Demo/Maps/Armory2014/tiles/13/7_2.jpg new file mode 100644 index 0000000..2be451c Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_3.jpg b/Demo/Maps/Armory2014/tiles/13/7_3.jpg new file mode 100644 index 0000000..2df11ae Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_4.jpg b/Demo/Maps/Armory2014/tiles/13/7_4.jpg new file mode 100644 index 0000000..6214f10 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_5.jpg b/Demo/Maps/Armory2014/tiles/13/7_5.jpg new file mode 100644 index 0000000..7079535 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_6.jpg b/Demo/Maps/Armory2014/tiles/13/7_6.jpg new file mode 100644 index 0000000..d131e4e Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_7.jpg b/Demo/Maps/Armory2014/tiles/13/7_7.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_8.jpg b/Demo/Maps/Armory2014/tiles/13/7_8.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/7_9.jpg b/Demo/Maps/Armory2014/tiles/13/7_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/7_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_0.jpg b/Demo/Maps/Armory2014/tiles/13/8_0.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_1.jpg b/Demo/Maps/Armory2014/tiles/13/8_1.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_10.jpg b/Demo/Maps/Armory2014/tiles/13/8_10.jpg new file mode 100644 index 0000000..5cfb9a9 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_2.jpg b/Demo/Maps/Armory2014/tiles/13/8_2.jpg new file mode 100644 index 0000000..a86dc38 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_3.jpg b/Demo/Maps/Armory2014/tiles/13/8_3.jpg new file mode 100644 index 0000000..fdd9d5b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_4.jpg b/Demo/Maps/Armory2014/tiles/13/8_4.jpg new file mode 100644 index 0000000..b4e87f8 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_5.jpg b/Demo/Maps/Armory2014/tiles/13/8_5.jpg new file mode 100644 index 0000000..95cb1b7 Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_6.jpg b/Demo/Maps/Armory2014/tiles/13/8_6.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_7.jpg b/Demo/Maps/Armory2014/tiles/13/8_7.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_8.jpg b/Demo/Maps/Armory2014/tiles/13/8_8.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/8_9.jpg b/Demo/Maps/Armory2014/tiles/13/8_9.jpg new file mode 100644 index 0000000..4875c2d Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/8_9.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_0.jpg b/Demo/Maps/Armory2014/tiles/13/9_0.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_0.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_1.jpg b/Demo/Maps/Armory2014/tiles/13/9_1.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_1.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_10.jpg b/Demo/Maps/Armory2014/tiles/13/9_10.jpg new file mode 100644 index 0000000..48e38fd Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_10.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_2.jpg b/Demo/Maps/Armory2014/tiles/13/9_2.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_2.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_3.jpg b/Demo/Maps/Armory2014/tiles/13/9_3.jpg new file mode 100644 index 0000000..699dfbb Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_3.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_4.jpg b/Demo/Maps/Armory2014/tiles/13/9_4.jpg new file mode 100644 index 0000000..57feb4a Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_4.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_5.jpg b/Demo/Maps/Armory2014/tiles/13/9_5.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_5.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_6.jpg b/Demo/Maps/Armory2014/tiles/13/9_6.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_6.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_7.jpg b/Demo/Maps/Armory2014/tiles/13/9_7.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_7.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_8.jpg b/Demo/Maps/Armory2014/tiles/13/9_8.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_8.jpg differ diff --git a/Demo/Maps/Armory2014/tiles/13/9_9.jpg b/Demo/Maps/Armory2014/tiles/13/9_9.jpg new file mode 100644 index 0000000..808dd1b Binary files /dev/null and b/Demo/Maps/Armory2014/tiles/13/9_9.jpg differ diff --git a/Demo/Podfile.lock b/Demo/Podfile.lock index 23b0d0a..03fbf82 100644 --- a/Demo/Podfile.lock +++ b/Demo/Podfile.lock @@ -4,7 +4,11 @@ PODS: - Expecta - FBSnapshotTestCase - FBSnapshotTestCase (1.1) - - NAMapKit (2.1) + - NAMapKit (3.0): + - SDWebImage + - SDWebImage (3.5.4): + - SDWebImage/Core + - SDWebImage/Core (3.5.4) - Specta (0.2.1) DEPENDENCIES: @@ -22,7 +26,8 @@ SPEC CHECKSUMS: Expecta: 5c147dedfea5fbcf773995f7e65020abcc936ce5 EXPMatchers+FBSnapshotTest: 1b9506577e494191565ff51ffd5b1e76339d727b FBSnapshotTestCase: 188c80bfcb72e744eb0b99d45989d12687c40cf8 - NAMapKit: cdb63fefc887562c85b6a6e46a284d9becd86324 + NAMapKit: faa7be13485d205c0df590867d1dccbce21c2a0a + SDWebImage: 1a62010700adbba823b621fc217906739dbf6aa5 Specta: 2d06220591110c6d9757d8be8ecf8e63aa40dc2a COCOAPODS: 0.29.0 diff --git a/Demo/Screenshots/brisbane.png b/Demo/Screenshots/brisbane.png new file mode 100644 index 0000000..fec5fb3 Binary files /dev/null and b/Demo/Screenshots/brisbane.png differ diff --git a/Demo/Screenshots/melbourne.png b/Demo/Screenshots/melbourne.png new file mode 100644 index 0000000..b47bf54 Binary files /dev/null and b/Demo/Screenshots/melbourne.png differ diff --git a/NAMapKit.podspec b/NAMapKit.podspec index c15aa5d..03941c4 100644 --- a/NAMapKit.podspec +++ b/NAMapKit.podspec @@ -1,21 +1,15 @@ -# -# Be sure to run `pod spec lint NAMapKit.podspec' to ensure this is a -# valid spec and remove all comments before submitting the spec. -# -# To learn more about the attributes see http://docs.cocoapods.org/specification.html -# Pod::Spec.new do |s| s.name = "NAMapKit" - s.version = "2.1" + s.version = "3.0" s.summary = "Allows you to use custom maps in MapKit compatible way." s.homepage = "https://github.com/neilang/NAMapKit" s.license = 'MIT' s.authors = { "Neil Ang" => "neil@neilang.com", "Tony Arnold" => "tony@thecocoabots.com" } s.source = { :git => "https://github.com/neilang/NAMapKit.git", :tag => "v2.1" } s.platform = :ios, '6.0' - s.source_files = "NaMapKit/*.{h,m}" - s.resources = "NAMapKit/*.png" + s.resources = "NAMapKit/*.png" s.frameworks = 'Foundation', 'UIKit', 'CoreGraphics' s.requires_arc = true + s.dependencies = ['SDWebImage'] end diff --git a/NAMapKit/NAAnnotation.h b/NAMapKit/NAAnnotation.h index caf2620..ba83cb3 100644 --- a/NAMapKit/NAAnnotation.h +++ b/NAMapKit/NAAnnotation.h @@ -24,5 +24,6 @@ -(UIView *)createViewOnMapView:(NAMapView *)mapView; @property (nonatomic, weak) NSObject *mapViewDelegate; +@property (nonatomic, readonly) NAMapView *mapView; @end diff --git a/NAMapKit/NAAnnotation.m b/NAMapKit/NAAnnotation.m index 771fd7d..3572ae5 100644 --- a/NAMapKit/NAAnnotation.m +++ b/NAMapKit/NAAnnotation.m @@ -12,10 +12,6 @@ const CGFloat dotRadius = 10.0f; const CGFloat dotOpacity = 0.5f; -@interface NAAnnotation () -@property (nonatomic, readonly) NAMapView *mapView; -@end - @implementation NAAnnotation + (id)annotationWithPoint:(CGPoint)point{ diff --git a/NAMapKit/NADZTileImageDataSource.h b/NAMapKit/NADZTileImageDataSource.h new file mode 100644 index 0000000..5cb67ba --- /dev/null +++ b/NAMapKit/NADZTileImageDataSource.h @@ -0,0 +1,29 @@ +// +// NADZTileImageDataSource.h +// +// Created by Daniel Doubrovkine on 3/10/14. +// +// + +#import +#import "NATiledImageViewDataSource.h" + +@interface NADZTileImageDataSource : NSObject + +@property (nonatomic) NSInteger maxTiledHeight; +@property (nonatomic) NSInteger maxTiledWidth; +@property (nonatomic) NSInteger tileSize; +@property (nonatomic) NSURL *tileBaseURL; +@property (nonatomic, copy) NSString *tileFormat; +@property (nonatomic) NSInteger maxTileLevel; +@property (nonatomic) NSInteger minTileLevel; + +- (NSURL *)tiledImageView:(NATiledImageView *)imageView urlForImageTileAtLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; +- (UIImage *)tiledImageView:(NATiledImageView *)imageView imageTileForLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; +- (void)tiledImageView:(NATiledImageView *)imageView didDownloadTiledImage:(UIImage *)image atURL:(NSURL *)url; +- (CGSize)imageSizeForImageView:(NATiledImageView *)imageView; +- (CGSize)tileSizeForImageView:(NATiledImageView *)imageView; +- (NSInteger)minimumImageZoomLevelForImageView:(NATiledImageView *)imageView; +- (NSInteger)maximumImageZoomLevelForImageView:(NATiledImageView *)imageView; + +@end diff --git a/NAMapKit/NADZTileImageDataSource.m b/NAMapKit/NADZTileImageDataSource.m new file mode 100644 index 0000000..fd54583 --- /dev/null +++ b/NAMapKit/NADZTileImageDataSource.m @@ -0,0 +1,61 @@ +// +// NADZTileImageDataSource.m +// +// Created by Daniel Doubrovkine on 3/10/14. +// +// + +#import "NADZTileImageDataSource.h" +#import "NATiledImageView.h" + +@implementation NADZTileImageDataSource + +- (NSURL *)tiledImageView:(NATiledImageView *)imageView urlForImageTileAtLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y +{ + return [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d/%d_%d.%@", self.tileBaseURL.absoluteString, level, x, y, self.tileFormat]]; +} + +- (UIImage *)tiledImageView:(NATiledImageView *)imageView imageTileForLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y +{ + NSString *cachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask].lastObject relativePath]; + NSCharacterSet *charactersToRemove =[[NSCharacterSet alphanumericCharacterSet] invertedSet]; + NSString *url = [[self.tileBaseURL.absoluteString componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@"_"]; + NSString *filename = [NSString stringWithFormat:@"%@/%@/%@_%@.%@", url, @(level), @(x), @(y), self.tileFormat]; + NSString *path = [NSString stringWithFormat:@"%@/%@", cachesDirectory, filename]; + return [UIImage imageWithContentsOfFile:path]; +} + +- (void)tiledImageView:(NATiledImageView *)imageView didDownloadTiledImage:(UIImage *)image atURL:(NSURL *)url +{ + NSString *cachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask].lastObject relativePath]; + NSCharacterSet *charactersToRemove =[[NSCharacterSet alphanumericCharacterSet] invertedSet]; + NSArray *urlParts = [url.absoluteString componentsSeparatedByCharactersInSet:charactersToRemove]; + NSString *filename = [NSString stringWithFormat:@"%@_%@.%@", urlParts[urlParts.count - 3], urlParts[urlParts.count - 2], urlParts[urlParts.count - 1]]; + NSString *directory = [[urlParts subarrayWithRange:NSMakeRange(0, urlParts.count - 4)] componentsJoinedByString:@"_"]; + NSString *path = [NSString stringWithFormat:@"%@/%@/%@", cachesDirectory, directory, urlParts[urlParts.count - 4]]; + [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; + NSString *pathWithFilename = [NSString stringWithFormat:@"%@/%@", path, filename]; + [UIImageJPEGRepresentation(image, 1.0) writeToFile:pathWithFilename atomically:YES]; +} + +- (CGSize)imageSizeForImageView:(NATiledImageView *)imageView +{ + return CGSizeMake(self.maxTiledWidth, self.maxTiledHeight); +} + +- (CGSize)tileSizeForImageView:(NATiledImageView *)imageView +{ + return CGSizeMake(self.tileSize, self.tileSize); +} + +- (NSInteger)minimumImageZoomLevelForImageView:(NATiledImageView *)imageView +{ + return self.minTileLevel; +} + +- (NSInteger)maximumImageZoomLevelForImageView:(NATiledImageView *)imageView +{ + return self.maxTileLevel; +} + +@end diff --git a/NAMapKit/NAMapView.h b/NAMapKit/NAMapView.h index 9000e57..c11d991 100644 --- a/NAMapKit/NAMapView.h +++ b/NAMapKit/NAMapView.h @@ -19,10 +19,13 @@ -(void)removeAnnotation:(NAAnnotation *)annotation; -(CGPoint)zoomRelativePoint:(CGPoint)point; -(void)selectAnnotation:(NAAnnotation *)annotation animated:(BOOL)animate; +-(void)centreOnPoint:(CGPoint)point animated:(BOOL)animate; -(void)setupMap; @property (nonatomic, readonly) CGFloat zoomLevel; +@property (nonatomic, assign) CGPoint centerPoint; @property (nonatomic, weak) NSObject *mapViewDelegate; +@property (nonatomic, assign) CGSize originalSize; @end diff --git a/NAMapKit/NAMapView.m b/NAMapKit/NAMapView.m index cb8c252..775c337 100644 --- a/NAMapKit/NAMapView.m +++ b/NAMapKit/NAMapView.m @@ -13,7 +13,6 @@ @interface NAMapView() @property (nonatomic, strong) UIImageView *imageView; -@property (nonatomic, assign) CGSize originalSize; @property (nonatomic, readonly) NSMutableArray *annotations; -(void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer; @@ -23,6 +22,12 @@ -(void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer; @implementation NAMapView +-(void)createImageView +{ + _imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; + [self addSubview:self.imageView]; +} + -(void)setupMap { self.delegate = self; @@ -35,10 +40,11 @@ -(void)setupMap { [self addGestureRecognizer:doubleTap]; [self addGestureRecognizer:twoFingerTap]; - _imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; - [self addSubview:self.imageView]; + [self createImageView]; _annotations = [NSMutableArray array]; + + [self.panGestureRecognizer addTarget:self action:@selector(mapPanGestureHandler:)]; } - (void)awakeFromNib { @@ -54,6 +60,13 @@ - (id)initWithFrame:(CGRect)frame { return self; } +- (void)mapPanGestureHandler:(UIPanGestureRecognizer *)panGesture +{ + if (panGesture.state == UIGestureRecognizerStateBegan){ + _centerPoint = CGPointZero; + } +} + - (void)displayMap:(UIImage *)map{ self.imageView.frame = CGRectMake(0.0f, 0.0f, map.size.width, map.size.height); self.imageView.image = map; @@ -82,6 +95,7 @@ - (void)centreOnPoint:(CGPoint)point animated:(BOOL)animate { float x = (point.x * self.zoomScale) - (self.frame.size.width / 2.0f); float y = (point.y * self.zoomScale) - (self.frame.size.height / 2.0f); [self setContentOffset:CGPointMake(round(x), round(y)) animated:animate]; + _centerPoint = point; } -(CGPoint)zoomRelativePoint:(CGPoint)point{ @@ -90,18 +104,29 @@ -(CGPoint)zoomRelativePoint:(CGPoint)point{ return CGPointMake(round(x), round(y)); } -- (void)selectAnnotation:(NAAnnotation *)annotation animated:(BOOL)animate +-(void)selectAnnotation:(NAAnnotation *)annotation animated:(BOOL)animate { } +-(void)setFrame:(CGRect)frame +{ + [super setFrame:frame]; + + BOOL zoomedOut = self.zoomScale == self.minimumZoomScale; + if (!CGPointEqualToPoint(self.centerPoint, CGPointZero) && !zoomedOut) { + [self centreOnPoint:self.centerPoint animated:NO]; + } +} + #pragma mark - UIScrollViewDelegate --(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { +-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView +{ return self.imageView; } -- (void)scrollViewDidZoom:(UIScrollView *)scrollView -{ +-(void)scrollViewDidZoom:(UIScrollView *)scrollView +{ [self.mapViewDelegate mapView:self hasChangedZoomLevel:self.zoomLevel]; } diff --git a/NAMapKit/NATiledImageMapView.h b/NAMapKit/NATiledImageMapView.h new file mode 100644 index 0000000..a70c9fe --- /dev/null +++ b/NAMapKit/NATiledImageMapView.h @@ -0,0 +1,30 @@ +// +// NATiledImageMapView.h +// +// Created by Daniel Doubrovkine on 3/10/14. +// +// + +#import "NAMapView.h" +#import "NATiledImageView.h" + +@interface NATiledImageMapView : NAMapView + +- (id)initWithFrame:(CGRect)frame tiledImageDataSource:(NSObject *)dataSource; + +// Zoom the map view to fit the current display. +- (void)zoomToFit:(BOOL)animate; + +// Calculates a coordinate for an annotation within the map's coordinate system, ie. within the entire full size image. +- (CGPoint)coordinateFor:(CGPoint)point; + +// Display tile borders, usually for debugging purposes. +@property (readwrite, nonatomic, assign) BOOL displayTileBorders; + +// Set a background image, displayed while tiles are being downloaded. +@property (readwrite, nonatomic) NSURL *backgroundImageURL; + +// Current map tile zoom level. +@property (readonly, nonatomic, assign) NSInteger tileZoomLevel; + +@end \ No newline at end of file diff --git a/NAMapKit/NATiledImageMapView.m b/NAMapKit/NATiledImageMapView.m new file mode 100644 index 0000000..9a92138 --- /dev/null +++ b/NAMapKit/NATiledImageMapView.m @@ -0,0 +1,126 @@ +// +// NATiledImageMapView.m +// +// Created by Daniel Doubrovkine on 3/10/14. +// +// + +#import "NATiledImageMapView.h" +#import + +@interface NATiledImageMapView () +@property (nonatomic, weak, readonly) NSObject *dataSource; +@property (nonatomic, readonly) NATiledImageView *tiledImageView; +@property (nonatomic, readonly) UIImageView *backgroundImageView; +@end + +@implementation NATiledImageMapView + +- (id)initWithFrame:(CGRect)frame tiledImageDataSource:(NSObject *)dataSource +{ + self = [super initWithFrame:frame]; + if (self) { + _dataSource = dataSource; + [self setupMap]; + } + return self; +} + +-(void)createImageView +{ + if (self.dataSource) { + _tiledImageView = [[NATiledImageView alloc] initWithDataSource:self.dataSource]; + self.tiledImageView.displayTileBorders = self.displayTileBorders; + [self addSubview:self.tiledImageView]; + } +} + +-(void)setupMap +{ + if (self.dataSource) { + [super setupMap]; + [self setMaxMinZoomScalesForCurrentBounds]; + } +} + +-(void)setDisplayTileBorders:(BOOL)displayTileBorders +{ + if (self.tiledImageView) { + self.tiledImageView.displayTileBorders = displayTileBorders; + } + _displayTileBorders = displayTileBorders; +} + +- (void)setMaxMinZoomScalesForCurrentBounds +{ + CGSize boundsSize = self.bounds.size; + CGSize imageSize = [self.dataSource imageSizeForImageView:nil]; + + // calculate min/max zoomscale + CGFloat xScale = boundsSize.width / imageSize.width; // the scale needed to perfectly fit the image width-wise + CGFloat yScale = boundsSize.height / imageSize.height; // the scale needed to perfectly fit the image height-wise + CGFloat minScale = MAX(xScale, yScale); // use minimum of these to allow the image to become fully visible + + CGFloat maxScale = 1.0; + + // don't let minScale exceed maxScale. (If the image is smaller than the screen, we don't want to force it to be zoomed.) + if (minScale > maxScale) { + minScale = maxScale; + } + + self.maximumZoomScale = maxScale * 0.6; + self.minimumZoomScale = minScale; + + self.originalSize = imageSize; + self.contentSize = boundsSize; +} + +- (void)zoomToFit:(BOOL)animate +{ + [self setZoomScale:self.minimumZoomScale animated:animate]; +} + +-(void)scrollViewDidZoom:(UIScrollView *)scrollView +{ + [super scrollViewDidZoom:scrollView]; + NSInteger newZoomLevel = self.tiledImageView.currentZoomLevel; + if (newZoomLevel != self.tileZoomLevel) { + // TODO: delegate that zoom level has changed + + // + // Repaint the map when the zoom level changes. + // + // NATiledImageView responds to rectangle repaint, figures out which tile to download from that rectangle and downloads tiles asynchronously. + // Whenever it gets a tile invalidates the rectangle in which it think it is. However, if the tile level has changed, it's invalidating a + // rectangle that is no longer relevant at the new tile level. This essentially does nothing. When you zoom in or out there're rectangles + // that have been painted already from the very first rectangle repaint, but the tile never told it to repaint itself again (it did, but + // at the wrong zoom level). + // + + [self.tiledImageView setNeedsDisplay]; + + _tileZoomLevel = self.tiledImageView.currentZoomLevel; + } +} + +- (void)setBackgroundImageURL:(NSURL *)backgroundImageURL +{ + UIImageView *backgroundImageView = [[UIImageView alloc] initWithFrame:self.tiledImageView.frame]; + [self insertSubview:backgroundImageView belowSubview:self.tiledImageView]; + [backgroundImageView setImageWithURL:backgroundImageURL]; + _backgroundImageView = backgroundImageView; + _backgroundImageURL = backgroundImageURL; +} + +-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView +{ + return self.tiledImageView; +} + +-(CGPoint)coordinateFor:(CGPoint)point +{ + CGSize tiledSize = [self.dataSource imageSizeForImageView:self.tiledImageView]; + return CGPointMake(tiledSize.width * point.x, tiledSize.height - (tiledSize.height * point.y)); +} + +@end diff --git a/NAMapKit/NATiledImageView.h b/NAMapKit/NATiledImageView.h new file mode 100644 index 0000000..0e22d2b --- /dev/null +++ b/NAMapKit/NATiledImageView.h @@ -0,0 +1,17 @@ +// +// NATiledImageView +// Created by orta on 2014/01/30. +// + +#import "NATiledImageViewDataSource.h" + +@interface NATiledImageView : UIView + +- (id)initWithDataSource:(NSObject *)dataSource; + +@property (readonly, nonatomic) NSObject *dataSource; +@property (readwrite, nonatomic, assign) BOOL displayTileBorders; +@property (readonly, nonatomic) NSInteger currentZoomLevel; + +- (void)cancelConcurrentDownloads; +@end \ No newline at end of file diff --git a/NAMapKit/NATiledImageView.m b/NAMapKit/NATiledImageView.m new file mode 100644 index 0000000..366fab5 --- /dev/null +++ b/NAMapKit/NATiledImageView.m @@ -0,0 +1,217 @@ +// +// NATiledImageView.m +// Created by Orta Therox on 2014/01/29. +// + +#import "NATiledImageView.h" +#import "NAAnnotation.h" +#import +#import + +@interface NATile : NSObject +@property (nonatomic, assign) CGRect tileRect; +@property (nonatomic, strong) UIImage *tileImage; +@end + +@implementation NATile : NSObject + +-(instancetype)initWithImage:(UIImage *)anImage rect:(CGRect)rect +{ + self = [super init]; + if (self == nil) return nil; + + _tileImage = anImage; + _tileRect = rect; + + return self; +} +@end + +// NATiledImageView responds to rectangle repaint, figures out which tile to download from that rectangle and downloads tiles asynchronously. +// It will cache images in SDWebCache and store images in local storage. +@interface NATiledImageView () +@property (nonatomic, assign) NSInteger maxLevelOfDetail; +@property (atomic, strong, readonly) NSCache *tileCache; +@property (atomic, strong, readonly) NSMutableArray *operationsArray; +@end + +@implementation NATiledImageView + +-(id)initWithDataSource:(NSObject *)dataSource; +{ + self = [super init]; + if (self) { + self.backgroundColor = [UIColor clearColor]; + _dataSource = dataSource; + + CATiledLayer *layer = (id)[self layer]; + layer.tileSize = [_dataSource tileSizeForImageView:self]; + + NSInteger min = [_dataSource minimumImageZoomLevelForImageView:self]; + NSInteger max = [_dataSource maximumImageZoomLevelForImageView:self]; + layer.levelsOfDetail = max - min + 1; + + self.maxLevelOfDetail = max; + + CGSize imagesize = [dataSource imageSizeForImageView:self]; + self.frame = CGRectMake(0, 0, imagesize.width, imagesize.height); + + _tileCache = [[NSCache alloc] init]; + _displayTileBorders = NO; + } + return self; +} + +- (void)drawRect:(CGRect)rect +{ + CGContextRef context = UIGraphicsGetCurrentContext(); + + // + // See http://openradar.appspot.com/8503490 + // + // Get the scale from the context by getting the current transform matrix, then asking for its "a" component, which is one of the two scale components. + // We need to also ask for the "d" component as it might not be precisely the same as the "a" component, even at the "same" scale. + // + + CGFloat _scaleX = CGContextGetCTM(context).a; + CGFloat _scaleY = CGContextGetCTM(context).d; + + CATiledLayer *tiledLayer = (CATiledLayer *)[self layer]; + CGSize tileSize = tiledLayer.tileSize; + + // + // Even at scales lower than 100%, we are drawing into a rect in the coordinate system of the full + // image. One tile at 50% covers the width (in original image coordinates) of two tiles at 100%. + // So at 50% we need to stretch our tiles to double the width and height; at 25% we need to stretch + // them to quadruple the width and height; and so on. + // + // (Note that this means that we are drawing very blurry images as the scale gets low. At 12.5%, + // our lowest scale, we are stretching about 6 small tiles to fill the entire original image area. + // But this is okay, because the big blurry image we're drawing here will be scaled way down before + // it is displayed.) + // + + tileSize.width /= _scaleX; + tileSize.height /= -_scaleY; + + NSInteger firstCol = floor(CGRectGetMinX(rect) / tileSize.width); + NSInteger lastCol = floor((CGRectGetMaxX(rect)-1) / tileSize.width); + NSInteger firstRow = floorf(CGRectGetMinY(rect) / tileSize.height); + NSInteger lastRow = floorf((CGRectGetMaxY(rect)-1) / tileSize.height); + + NSInteger level = self.maxLevelOfDetail + roundf(log2f(_scaleX)); + _currentZoomLevel = level; + + NSMutableArray *requestURLs = [NSMutableArray array]; + for (NSInteger row = firstRow; row <= lastRow; row++) { + for (NSInteger col = firstCol; col <= lastCol; col++) { + + CGRect tileRect = CGRectMake(tileSize.width * col, tileSize.height * row, tileSize.width, tileSize.height); + UIImage *tileImage = [self.dataSource tiledImageView:self imageTileForLevel:level x:col y:row]; + NSURL *tileURL = [self.dataSource tiledImageView:self urlForImageTileAtLevel:level x:col y:row]; + + NATile *tile = [self.tileCache objectForKey:[tileURL absoluteString]]; + if (! tile) { + tileRect = CGRectIntersection(self.bounds, tileRect); + tile = [[NATile alloc] initWithImage:tileImage rect:tileRect]; + [self.tileCache setObject:tile forKey:[tileURL absoluteString] cost:level]; + } + + if (! tile.tileImage && tileImage) { + tile.tileImage = tileImage; + } + + if (! tile.tileImage) { + [requestURLs addObject:tileURL]; + } else { + [tile.tileImage drawInRect:tile.tileRect blendMode:kCGBlendModeNormal alpha:1]; + if (self.displayTileBorders) { + [[UIColor greenColor] set]; + CGContextSetLineWidth(context, 6.0); + CGContextStrokeRect(context, tileRect); + } + } + } + } + + if (requestURLs.count && self && [self isKindOfClass:[NATiledImageView class]]) { + [self downloadAndRedrawTilesWithURLs:[NSArray arrayWithArray:requestURLs]]; + } +} + ++(Class)layerClass +{ + return [CATiledLayer class]; +} + +-(void)setContentScaleFactor:(CGFloat)contentScaleFactor +{ + [super setContentScaleFactor:1.f]; +} + +-(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs +{ + __weak typeof(self) wself = self; + + for(NSURL *tileURL in arrayOfURLs) { + + id operation = nil; + operation = [SDWebImageManager.sharedManager downloadWithURL:tileURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { + if (!wself || !finished ) return; + + if (error){ + // Ideally we want to mke sure this doesn't happen multiple times + [wself performSelector:_cmd withObject:arrayOfURLs afterDelay:1]; + return; + } + + void (^block)(void) = ^{ + __strong typeof(wself) sself = wself; + if (!sself) return; + + if (image) { + NATile *tile = [sself.tileCache objectForKey:[tileURL absoluteString]]; + if (!tile) return; + + tile.tileImage = image; + [sself setNeedsDisplayInRect:tile.tileRect]; + + // Overwrite the existing object in cache now that we have a real cost + NSInteger cost = image.size.height * image.size.width * image.scale; + [sself.tileCache setObject:tile forKey:[tileURL absoluteString] cost:cost]; + + if([sself.dataSource respondsToSelector:@selector(tiledImageView:didDownloadTiledImage:atURL:)]){ + [sself.dataSource tiledImageView:self didDownloadTiledImage:image atURL:tileURL]; + } + } + }; + + if ([NSThread isMainThread]) { + block(); + } else { + dispatch_sync(dispatch_get_main_queue(), block); + } + }]; + + [_operationsArray addObject:operation]; + } + +} + +-(void)dealloc +{ + [self cancelConcurrentDownloads]; + [_tileCache removeAllObjects]; +} + +-(void)cancelConcurrentDownloads +{ + for(id operation in _operationsArray) { + if (operation) { + [operation cancel]; + } + } + _operationsArray = nil; +} + +@end \ No newline at end of file diff --git a/NAMapKit/NATiledImageViewDataSource.h b/NAMapKit/NATiledImageViewDataSource.h new file mode 100644 index 0000000..bf5c127 --- /dev/null +++ b/NAMapKit/NATiledImageViewDataSource.h @@ -0,0 +1,21 @@ +// +// NATiledImageDataSource.h +// +// Created by Daniel Doubrovkine on 3/10/14. +// +// + +@class NATiledImageView; + +@protocol NATiledImageViewDataSource +- (UIImage *)tiledImageView:(NATiledImageView *)imageView imageTileForLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; +- (CGSize)tileSizeForImageView:(NATiledImageView *)imageView; +- (CGSize)imageSizeForImageView:(NATiledImageView *)imageView; +- (NSInteger)minimumImageZoomLevelForImageView:(NATiledImageView *)imageView; +- (NSInteger)maximumImageZoomLevelForImageView:(NATiledImageView *)imageView; + +@optional +- (NSURL *)tiledImageView:(NATiledImageView *)imageView urlForImageTileAtLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; +- (void)tiledImageView:(NATiledImageView *)imageView didDownloadTiledImage:(UIImage *)image atURL:(NSURL *)url; +@end + diff --git a/README.md b/README.md index cab944a..58fde15 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,17 @@ NAMapKit [![Build Status](https://travis-ci.org/neilang/NAMapKit.png)](https://travis-ci.org/neilang/NAMapKit) -Lets you drop MapKit style pins onto a standard UIImage. Also includes callouts, multi-colored pins, animation, zoom and gestures. +Lets you drop MapKit style pins or custom annotations onto a standard `UIImage` or a tiled `NATiledImageView`. Includes callouts, multi-colored pins, animation, zoom and gestures support. -![Screenshot 1](screenshot1.png) -![Screenshot 2](screenshot2.png) +![Melbourne, Australia](Demo/Screenshots/melbourne.png) +![Brisbane, Australia](Demo/Screenshots/brisbane.png) Usage ----- #### Default Annotations -Create a map in a view controller. +Create a `NAMapView` in a view controller. ``` objc NAMapView *mapView = [[NAMapView alloc] initWithFrame:self.view.bounds]; @@ -29,7 +29,7 @@ mapView.maximumZoomScale = 1.5f; [self.view addSubview:mapView]; ``` -Add annotations. +Add default `NAAnnotation` annotations. ``` NAAnnotation *dot = [NAAnnotation annotationWithPoint:CGPointMake(543.0f, 489.0f)]; @@ -38,28 +38,30 @@ NAAnnotation *dot = [NAAnnotation annotationWithPoint:CGPointMake(543.0f, 489.0f #### Custom Annotations -The default implementation places a red semi-transparent dot on the map. Subclass [NAAnnotation](NAMapKit/NAAnnotation.h) and implement `createViewOnMapView` that returns a custom annotation view. Optionally implement `addToMapView` when the annotation is added, and `updatePosition` to change the location of the view every time the map is zoomed in or zoomed out. +The default implementation of `NAAnnotation` places a red semi-transparent dot on the map. You can subclass [NAAnnotation](NAMapKit/NAAnnotation.h) and implement `createViewOnMapView` that returns a custom annotation view. You could also implement a custom animation to drop an annotation onto the map by implementing `addToMapView`, or center the annotation depending on your custom logic by overriding `updatePosition`. -You can find a complete example in [NAPinAnnotation.h](NAMapKit/NAPinAnnotation.h)/[.m](NAMapKit/NAPinAnnotation.m). +You can find a complete custom annotation example of multi-colored pins in [NAPinAnnotation.h](NAMapKit/NAPinAnnotation.h)/[.m](NAMapKit/NAPinAnnotation.m). #### Delegates -You can capture taps and zoom via [NAMapViewDelegate](NAMapKit/NAMapViewDelegate.h). +You can capture finger taps and zoom changes by registering a `mapViewDelegate` with the map. The delegate must implement the [NAMapViewDelegate](NAMapKit/NAMapViewDelegate.h) protocol. ```objc @implementation DemoViewController -(void)viewDidLoad { - // ... + // register the view controller as the map's delegate self.mapView.mapViewDelegate = self; } +// invoked when a user taps an annotation - (void)mapView:(NAMapView *)mapView tappedOnAnnotation:(NAPinAnnotation *)annotation { } +// invoked when the map zoom level changes - (void)mapView:(NAMapView *)mapView hasChangedZoomLevel:(CGFloat)level { @@ -68,12 +70,25 @@ You can capture taps and zoom via [NAMapViewDelegate](NAMapKit/NAMapViewDelegate @end ``` +See [NAAnnotationDemoViewController.m](Demo/Demo/NAAnnotationDemoViewController.m) for a complete example. + +#### Tiled Maps + +NAMapKit comes with [NATiledImageMapView](NAMapKit/NATiledImageMapView.h), which supports tiled maps. A typical organization for deep zoom map tiles consists of a folder for each zoom level and individual JPG files for each tile. You can see an example of such files [here](Demo/Maps/Armory2014/tiles). NAMapKit ships with [NADZTileImageDataSource](NAMapKit/NADZTileImageDataSource.h), which retrieves map tiles from a remote URL and stores them in *Library/Caches* (`NSCachesDirectory`). + +For a complete example of a tiled map, see [NATiledImageDemoViewController.m](Demo/Demo/NATiledImageDemoViewController.m). + Notes ----- Current version _requires ARC and iOS5_ (untested on iOS4). If you are developing for iOS3/4, checkout the version 1.0 tag of the repository. -If you are using Interface Builder, you can add a UIScrollView to your XIB and change the class to "NAMapView" to use the framework. +If you are using Interface Builder, you can add a UIScrollView to your XIB and change the class to `NAMapView` to use the framework. + +License +------- + +This project is licensed under the [MIT license](LICENSE). Attribution ----------- diff --git a/screenshot1.png b/screenshot1.png deleted file mode 100644 index c940a0e..0000000 Binary files a/screenshot1.png and /dev/null differ diff --git a/screenshot2.png b/screenshot2.png deleted file mode 100644 index 822e7aa..0000000 Binary files a/screenshot2.png and /dev/null differ