From ec0b77ba6f54de0ffe686f01ecc4d36d96d5c206 Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 11:05:48 -0400 Subject: [PATCH 1/7] Fix: prevent downloading of tiles multiple times. --- NAMapKit/NATiledImageView.m | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/NAMapKit/NATiledImageView.m b/NAMapKit/NATiledImageView.m index 366fab5..bcb1470 100644 --- a/NAMapKit/NATiledImageView.m +++ b/NAMapKit/NATiledImageView.m @@ -32,7 +32,7 @@ -(instancetype)initWithImage:(UIImage *)anImage rect:(CGRect)rect @interface NATiledImageView () @property (nonatomic, assign) NSInteger maxLevelOfDetail; @property (atomic, strong, readonly) NSCache *tileCache; -@property (atomic, strong, readonly) NSMutableArray *operationsArray; +@property (atomic, readonly) NSMutableDictionary *downloadOperations; @end @implementation NATiledImageView @@ -58,6 +58,7 @@ -(id)initWithDataSource:(NSObject *)dataSource; _tileCache = [[NSCache alloc] init]; _displayTileBorders = NO; + _downloadOperations = [[NSMutableDictionary alloc] init]; } return self; } @@ -154,24 +155,33 @@ -(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs __weak typeof(self) wself = self; for(NSURL *tileURL in arrayOfURLs) { - + if ([self.downloadOperations objectForKey:tileURL]) { + continue; + } + 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 (!wself || !finished ) { + return; + } if (error){ - // Ideally we want to mke sure this doesn't happen multiple times + // TODO: 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 (! sself) { + return; + } if (image) { NATile *tile = [sself.tileCache objectForKey:[tileURL absoluteString]]; - if (!tile) return; + if (!tile) { + return; + } tile.tileImage = image; [sself setNeedsDisplayInRect:tile.tileRect]; @@ -180,10 +190,12 @@ -(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs 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:)]){ + if([sself.dataSource respondsToSelector:@selector(tiledImageView:didDownloadTiledImage:atURL:)]) { [sself.dataSource tiledImageView:self didDownloadTiledImage:image atURL:tileURL]; } } + + [sself.downloadOperations removeObjectForKey:tileURL]; }; if ([NSThread isMainThread]) { @@ -193,9 +205,8 @@ -(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs } }]; - [_operationsArray addObject:operation]; + [self.downloadOperations setObject:operation forKey:tileURL]; } - } -(void)dealloc @@ -206,12 +217,13 @@ -(void)dealloc -(void)cancelConcurrentDownloads { - for(id operation in _operationsArray) { + for(id operation in self.downloadOperations.objectEnumerator) { if (operation) { [operation cancel]; } } - _operationsArray = nil; + + _downloadOperations = nil; } @end \ No newline at end of file From 3b14112a056b178b9451f001b100bfbe79c84e55 Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 11:06:17 -0400 Subject: [PATCH 2/7] Added tests for tiled image demo view. --- .../NATiledImageMapViewControllerTests.m | 12 +++++++++--- .../default@2x.png | Bin 0 -> 136940 bytes 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 Demo/DemoTests/ReferenceImages/NATiledImageDemoViewControllerSpec/default@2x.png diff --git a/Demo/DemoTests/NATiledImageMapViewControllerTests.m b/Demo/DemoTests/NATiledImageMapViewControllerTests.m index 414ff82..ad0cf4f 100644 --- a/Demo/DemoTests/NATiledImageMapViewControllerTests.m +++ b/Demo/DemoTests/NATiledImageMapViewControllerTests.m @@ -16,14 +16,20 @@ __block NATiledImageDemoViewController *vc = nil; beforeEach(^{ + UIWindow *window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; vc = [[NATiledImageDemoViewController alloc] init]; + window.rootViewController = vc; expect(vc.view).willNot.beNil(); + [window makeKeyAndVisible]; }); // 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"); +it(@"displays map with a pin", ^AsyncBlock { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long) NULL), ^(void) { + [NSThread sleepForTimeInterval:3.0]; + expect(vc.view).to.haveValidSnapshotNamed(@"default"); + done(); + }); }); SpecEnd diff --git a/Demo/DemoTests/ReferenceImages/NATiledImageDemoViewControllerSpec/default@2x.png b/Demo/DemoTests/ReferenceImages/NATiledImageDemoViewControllerSpec/default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0d3bcb48cc71c9ac9487323fab4562da58af2b GIT binary patch literal 136940 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 literal 0 HcmV?d00001 From e9c41afc1b2fa5f797a124fe99bca4a4db16a79f Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 12:32:39 -0400 Subject: [PATCH 3/7] Allow customizing zoom step. --- Demo/Demo/NATiledImageDemoViewController.h | 2 +- Demo/Demo/NATiledImageDemoViewController.m | 11 ++++----- NAMapKit/NAMapView.h | 26 +++++++++++++++++----- NAMapKit/NAMapView.m | 19 ++++++++-------- NAMapKit/NAMapViewDelegate.h | 20 +++++++++++++++-- 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/Demo/Demo/NATiledImageDemoViewController.h b/Demo/Demo/NATiledImageDemoViewController.h index d715e1e..bf9fc34 100644 --- a/Demo/Demo/NATiledImageDemoViewController.h +++ b/Demo/Demo/NATiledImageDemoViewController.h @@ -2,7 +2,7 @@ // NATiledImageDemoViewController.h // // Created by Daniel Doubrovkine on 3/10/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NATiledImageDemoViewController.m b/Demo/Demo/NATiledImageDemoViewController.m index 7011e75..18971b7 100644 --- a/Demo/Demo/NATiledImageDemoViewController.m +++ b/Demo/Demo/NATiledImageDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/10/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NATiledImageDemoViewController.h" @@ -19,7 +19,7 @@ @implementation NATiledImageDemoViewController -(void)viewDidLoad { [super viewDidLoad]; - + NADZTileImageDataSource *dzTileImageDataSource = [[NADZTileImageDataSource alloc] init]; dzTileImageDataSource.maxTiledHeight = 5389; dzTileImageDataSource.maxTiledWidth = 5000; @@ -28,16 +28,17 @@ -(void)viewDidLoad 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.zoomStep = 3.0f; _mapView = mapView; - + [self.view addSubview:mapView]; - + NAAnnotation *champagneBar = [NAAnnotation annotationWithPoint:[mapView coordinateFor:CGPointMake(0.30f, 0.10f)]]; [mapView addAnnotation:champagneBar animated:NO]; diff --git a/NAMapKit/NAMapView.h b/NAMapKit/NAMapView.h index c11d991..5294c8e 100644 --- a/NAMapKit/NAMapView.h +++ b/NAMapKit/NAMapView.h @@ -1,31 +1,45 @@ // -// NAAnnotation.h -// NAMapKit +// NAMapView.h +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import #import "NAAnnotation.h" #import "NAMapViewDelegate.h" +// A zoomable, scrollable map with an image in the background. @interface NAMapView : UIScrollView +// Display a map with a background image. -(void)displayMap:(UIImage *)map; +// Add an annotation. -(void)addAnnotation:(NAAnnotation *)annotation animated:(BOOL)animate; +// Add a set of annotations. -(void)addAnnotations:(NSArray *)annotations animated:(BOOL)animate; --(void)centreOnPoint:(CGPoint)point animated:(BOOL)animate; +// Remove an annotation. -(void)removeAnnotation:(NAAnnotation *)annotation; +// Calculate the point on the screen from a point on the original image at the current zoom level. -(CGPoint)zoomRelativePoint:(CGPoint)point; +// Select a particular annotation, notably centers the map on the annotation point. -(void)selectAnnotation:(NAAnnotation *)annotation animated:(BOOL)animate; --(void)centreOnPoint:(CGPoint)point animated:(BOOL)animate; +// Center map on a given point. +-(void)centerOnPoint:(CGPoint)point animated:(BOOL)animate; +// Callback invoked to setup the map. -(void)setupMap; +// Current map zoom level. @property (nonatomic, readonly) CGFloat zoomLevel; +// Point on which to center the map by default. @property (nonatomic, assign) CGPoint centerPoint; +// A delegate for receiving map notifications. @property (nonatomic, weak) NSObject *mapViewDelegate; +// Size of the map, typically the full size of the background image. @property (nonatomic, assign) CGSize originalSize; +// Amount by which to zoom in or zoom out with every double-tap, default is 1.5f. +@property (nonatomic, assign) CGFloat zoomStep; @end diff --git a/NAMapKit/NAMapView.m b/NAMapKit/NAMapView.m index 775c337..93c9202 100644 --- a/NAMapKit/NAMapView.m +++ b/NAMapKit/NAMapView.m @@ -1,14 +1,14 @@ // -// NAMapView.h -// NAMapKit +// NAMapView.m +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAMapView.h" -const CGFloat zoomStep = 1.5f; +const CGFloat defaultZoomStep = 1.5f; @interface NAMapView() @@ -43,6 +43,7 @@ -(void)setupMap { [self createImageView]; _annotations = [NSMutableArray array]; + _zoomStep = defaultZoomStep; [self.panGestureRecognizer addTarget:self action:@selector(mapPanGestureHandler:)]; } @@ -91,7 +92,7 @@ -(void)removeAnnotation:(NAAnnotation *)annotation { [self.annotations removeObject:annotation]; } -- (void)centreOnPoint:(CGPoint)point animated:(BOOL)animate { +- (void)centerOnPoint:(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]; @@ -114,7 +115,7 @@ -(void)setFrame:(CGRect)frame BOOL zoomedOut = self.zoomScale == self.minimumZoomScale; if (!CGPointEqualToPoint(self.centerPoint, CGPointZero) && !zoomedOut) { - [self centreOnPoint:self.centerPoint animated:NO]; + [self centerOnPoint:self.centerPoint animated:NO]; } } @@ -139,13 +140,13 @@ -(CGFloat)zoomLevel -(void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { // double tap zooms in, but returns to normal zoom level if it reaches max zoom - float newScale = self.zoomScale >= self.maximumZoomScale ? self.minimumZoomScale : self.zoomScale * zoomStep; + float newScale = self.zoomScale >= self.maximumZoomScale ? self.minimumZoomScale : self.zoomScale * self.zoomStep; [self setZoomScale:newScale animated:YES]; } -(void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer { // two-finger tap zooms out, but returns to normal zoom level if it reaches min zoom - float newScale = self.zoomScale <= self.minimumZoomScale ? self.maximumZoomScale : self.zoomScale / zoomStep; + float newScale = self.zoomScale <= self.minimumZoomScale ? self.maximumZoomScale : self.zoomScale / self.zoomStep; [self setZoomScale:newScale animated:YES]; } diff --git a/NAMapKit/NAMapViewDelegate.h b/NAMapKit/NAMapViewDelegate.h index 9f5689c..4098661 100644 --- a/NAMapKit/NAMapViewDelegate.h +++ b/NAMapKit/NAMapViewDelegate.h @@ -1,16 +1,32 @@ // // NAMapViewDelegate.h -// Pods +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // @class NAMapView; @class NAAnnotation; +/** + * An NAMapView delegate. + */ @protocol NAMapViewDelegate @optional +/** + * An annotation has been tapped. + * + * @param mapView Map view on which the annotation has been tapped. + * @param annotation The annotation that has been tapped. + */ - (void)mapView:(NAMapView *)mapView tappedOnAnnotation:(NAAnnotation *)annotation; + +/** + * Zoom level has changed. + * + * @param mapView The map view on which the zoom level has changed. + * @param level The new zoom level. + */ - (void)mapView:(NAMapView *)mapView hasChangedZoomLevel:(CGFloat)level; @end From 67f47dec3ad0ca3faa70c6e32627e098ddb7067d Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 12:33:06 -0400 Subject: [PATCH 4/7] Standardized file headers and documented code. --- Demo/Demo/NAAnimatedDemoViewController.h | 2 +- Demo/Demo/NAAnimatedDemoViewController.m | 2 +- Demo/Demo/NAAnnotationDemoViewController.h | 2 +- Demo/Demo/NAAnnotationDemoViewController.m | 4 +- Demo/Demo/NAAppDelegate.h | 3 +- Demo/Demo/NAAppDelegate.m | 29 +------- Demo/Demo/NAInteractiveDemoViewController.h | 2 +- Demo/Demo/NAInteractiveDemoViewController.m | 14 ++-- Demo/Demo/NALoadViaNIBDemoViewController.h | 2 +- Demo/Demo/NALoadViaNIBDemoViewController.m | 2 +- Demo/Demo/NAMasterViewController.h | 2 +- Demo/Demo/NAMasterViewController.m | 10 +-- .../Demo/NAPinAnnotationsDemoViewController.h | 2 +- .../Demo/NAPinAnnotationsDemoViewController.m | 4 +- .../NAAnnotationDemoViewControllerTests.m | 2 +- .../NAInteractiveDemoViewControllerTests.m | 2 +- .../NALoadViaNIBDemoViewControllerTests.m | 2 +- Demo/DemoTests/NAMapViewTests.m | 8 +-- Demo/DemoTests/NAMasterViewControllerTests.m | 2 +- .../NAPinAnnotationsDemoViewControllerTests.m | 2 +- .../NATiledImageMapViewControllerTests.m | 2 +- NAMapKit/NAAnnotation.h | 21 ++++-- NAMapKit/NAAnnotation.m | 8 +-- NAMapKit/NADZTileImageDataSource.h | 13 +++- NAMapKit/NADZTileImageDataSource.m | 3 +- NAMapKit/NAPinAnnotation.h | 16 +++-- NAMapKit/NAPinAnnotation.m | 8 +-- NAMapKit/NAPinAnnotationCallOutView.h | 16 +++-- NAMapKit/NAPinAnnotationCallOutView.m | 12 ++-- NAMapKit/NAPinAnnotationMapView.h | 6 +- NAMapKit/NAPinAnnotationMapView.m | 8 ++- NAMapKit/NAPinAnnotationView.h | 15 ++-- NAMapKit/NAPinAnnotationView.m | 14 ++-- NAMapKit/NATiledImageMapView.h | 6 +- NAMapKit/NATiledImageMapView.m | 16 +---- NAMapKit/NATiledImageView.h | 17 ++++- NAMapKit/NATiledImageView.m | 3 + NAMapKit/NATiledImageViewDataSource.h | 69 ++++++++++++++++++- 38 files changed, 224 insertions(+), 127 deletions(-) diff --git a/Demo/Demo/NAAnimatedDemoViewController.h b/Demo/Demo/NAAnimatedDemoViewController.h index 125d128..bffd66f 100644 --- a/Demo/Demo/NAAnimatedDemoViewController.h +++ b/Demo/Demo/NAAnimatedDemoViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NAAnimatedDemoViewController.m b/Demo/Demo/NAAnimatedDemoViewController.m index 1d35162..7ccb22c 100644 --- a/Demo/Demo/NAAnimatedDemoViewController.m +++ b/Demo/Demo/NAAnimatedDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAnimatedDemoViewController.h" diff --git a/Demo/Demo/NAAnnotationDemoViewController.h b/Demo/Demo/NAAnnotationDemoViewController.h index 2a6c818..70e8e41 100644 --- a/Demo/Demo/NAAnnotationDemoViewController.h +++ b/Demo/Demo/NAAnnotationDemoViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NAAnnotationDemoViewController.m b/Demo/Demo/NAAnnotationDemoViewController.m index 9ff7810..484d9cc 100644 --- a/Demo/Demo/NAAnnotationDemoViewController.m +++ b/Demo/Demo/NAAnnotationDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAnnotationDemoViewController.h" @@ -16,7 +16,7 @@ - (void)viewDidLoad [super viewDidLoad]; NAMapView *mapView = [[NAMapView alloc] initWithFrame:self.view.bounds]; - + mapView.mapViewDelegate = self; mapView.backgroundColor = [UIColor colorWithRed:0.000f green:0.475f blue:0.761f alpha:1.000f]; mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; diff --git a/Demo/Demo/NAAppDelegate.h b/Demo/Demo/NAAppDelegate.h index 05a2be9..4c8664e 100644 --- a/Demo/Demo/NAAppDelegate.h +++ b/Demo/Demo/NAAppDelegate.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import @@ -11,7 +11,6 @@ @interface NAAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; - @property (strong, nonatomic) UINavigationController *navigationController; @end diff --git a/Demo/Demo/NAAppDelegate.m b/Demo/Demo/NAAppDelegate.m index 0366a37..22ac541 100644 --- a/Demo/Demo/NAAppDelegate.m +++ b/Demo/Demo/NAAppDelegate.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAppDelegate.h" @@ -24,31 +24,4 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( return YES; } -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - @end diff --git a/Demo/Demo/NAInteractiveDemoViewController.h b/Demo/Demo/NAInteractiveDemoViewController.h index fa753f4..964f9c1 100644 --- a/Demo/Demo/NAInteractiveDemoViewController.h +++ b/Demo/Demo/NAInteractiveDemoViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NAInteractiveDemoViewController.m b/Demo/Demo/NAInteractiveDemoViewController.m index 20b36af..82eee4c 100644 --- a/Demo/Demo/NAInteractiveDemoViewController.m +++ b/Demo/Demo/NAInteractiveDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAInteractiveDemoViewController.h" @@ -31,7 +31,7 @@ -(void)viewDidLoad self.mapView.backgroundColor = [UIColor colorWithRed:0.000f green:0.475f blue:0.761f alpha:1.000f]; self.mapView.mapViewDelegate = self; - + [self.mapView displayMap:image]; [self mapView:self.mapView hasChangedZoomLevel:self.mapView.zoomLevel]; @@ -49,13 +49,13 @@ -(IBAction)addPin:(id)sender{ int y = (arc4random() % (int)self.size.width); CGPoint point = CGPointMake(x, y); - + [self addPinAt:point withColor:arc4random() % 3]; } -(void)addPinAt:(CGPoint)point withColor:(NAPinColor)color{ - [self.mapView centreOnPoint:point animated:YES]; + [self.mapView centerOnPoint:point animated:YES]; NAPinAnnotation *annotation = [NAPinAnnotation annotationWithPoint:point]; @@ -75,7 +75,7 @@ -(IBAction)removePin:(id)sender{ if([self.annotations count] <= 0 || _lastFocused == nil) return; - [self.mapView centreOnPoint:_lastFocused.point animated:YES]; + [self.mapView centerOnPoint:_lastFocused.point animated:YES]; [self.mapView removeAnnotation:_lastFocused]; @@ -93,11 +93,11 @@ -(IBAction)selectRandom:(id)sender{ -(void)selectPinAt:(NSInteger)index{ NAPinAnnotation *annotation = [self.annotations objectAtIndex:index]; - + self.selectedPinLabel.text = [NSString stringWithFormat:@"%@", annotation.title]; [self.mapView selectAnnotation:annotation animated:YES]; - + _lastFocused = annotation; } diff --git a/Demo/Demo/NALoadViaNIBDemoViewController.h b/Demo/Demo/NALoadViaNIBDemoViewController.h index d0a0176..e39c341 100644 --- a/Demo/Demo/NALoadViaNIBDemoViewController.h +++ b/Demo/Demo/NALoadViaNIBDemoViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NALoadViaNIBDemoViewController.m b/Demo/Demo/NALoadViaNIBDemoViewController.m index da63ec1..61821a4 100644 --- a/Demo/Demo/NALoadViaNIBDemoViewController.m +++ b/Demo/Demo/NALoadViaNIBDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NALoadViaNIBDemoViewController.h" diff --git a/Demo/Demo/NAMasterViewController.h b/Demo/Demo/NAMasterViewController.h index 8b5d877..6c51ab2 100644 --- a/Demo/Demo/NAMasterViewController.h +++ b/Demo/Demo/NAMasterViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NAMasterViewController.m b/Demo/Demo/NAMasterViewController.m index 848477f..90ca977 100644 --- a/Demo/Demo/NAMasterViewController.m +++ b/Demo/Demo/NAMasterViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAMasterViewController.h" @@ -24,7 +24,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil } return self; } - + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); @@ -44,13 +44,13 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; - + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } - + switch (indexPath.row) { case 0: cell.textLabel.text = @"Simple Annotations Demo"; @@ -74,7 +74,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.textLabel.text = @"???"; break; } - + return cell; } diff --git a/Demo/Demo/NAPinAnnotationsDemoViewController.h b/Demo/Demo/NAPinAnnotationsDemoViewController.h index 797d778..6fd8fc9 100644 --- a/Demo/Demo/NAPinAnnotationsDemoViewController.h +++ b/Demo/Demo/NAPinAnnotationsDemoViewController.h @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import diff --git a/Demo/Demo/NAPinAnnotationsDemoViewController.m b/Demo/Demo/NAPinAnnotationsDemoViewController.m index c72d6ca..7b7cc60 100644 --- a/Demo/Demo/NAPinAnnotationsDemoViewController.m +++ b/Demo/Demo/NAPinAnnotationsDemoViewController.m @@ -3,7 +3,7 @@ // Demo // // Created by Neil Ang on 6/05/12. -// Copyright (c) 2012 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotationsDemoViewController.h" @@ -43,7 +43,7 @@ - (void)viewDidLoad perth.color = NAPinColorRed; [mapView addAnnotation:perth animated:YES]; - + NAPinAnnotation * brisbane = [NAPinAnnotation annotationWithPoint:CGPointMake(679.0f, 302.0f)]; brisbane.title = @"Brisbane"; brisbane.color = NAPinColorPurple; diff --git a/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m b/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m index 76867de..c25d04e 100644 --- a/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m +++ b/Demo/DemoTests/NAAnnotationDemoViewControllerTests.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/8/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAnnotationDemoViewController.h" diff --git a/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m b/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m index bd3830d..a9e4495 100644 --- a/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m +++ b/Demo/DemoTests/NAInteractiveDemoViewControllerTests.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAInteractiveDemoViewController.h" diff --git a/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m b/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m index 37e8983..99c4196 100644 --- a/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m +++ b/Demo/DemoTests/NALoadViaNIBDemoViewControllerTests.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NALoadViaNIBDemoViewController.h" diff --git a/Demo/DemoTests/NAMapViewTests.m b/Demo/DemoTests/NAMapViewTests.m index c1545c4..d58fdae 100644 --- a/Demo/DemoTests/NAMapViewTests.m +++ b/Demo/DemoTests/NAMapViewTests.m @@ -2,19 +2,19 @@ // NAMapKitTests // // Created by Daniel Doubrovkine on 3/6/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // SpecBegin(NAMapView) describe(@"init", ^{ - + __block NAMapView *mapView = nil; - + beforeEach(^{ mapView = [[NAMapView alloc] init]; }); - + it(@"creates an instance", ^{ expect(mapView).toNot.beNil(); expect(mapView).to.beKindOf([NAMapView class]); diff --git a/Demo/DemoTests/NAMasterViewControllerTests.m b/Demo/DemoTests/NAMasterViewControllerTests.m index 1af6fe7..128091e 100644 --- a/Demo/DemoTests/NAMasterViewControllerTests.m +++ b/Demo/DemoTests/NAMasterViewControllerTests.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAMasterViewController.h" diff --git a/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m b/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m index 7b776ad..1637bac 100644 --- a/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m +++ b/Demo/DemoTests/NAPinAnnotationsDemoViewControllerTests.m @@ -3,7 +3,7 @@ // Demo // // Created by Daniel Doubrovkine on 3/7/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotationsDemoViewController.h" diff --git a/Demo/DemoTests/NATiledImageMapViewControllerTests.m b/Demo/DemoTests/NATiledImageMapViewControllerTests.m index ad0cf4f..bd3da17 100644 --- a/Demo/DemoTests/NATiledImageMapViewControllerTests.m +++ b/Demo/DemoTests/NATiledImageMapViewControllerTests.m @@ -2,7 +2,7 @@ // NATiledImageMapViewTests.m // // Created by Daniel Doubrovkine on 3/11/14. -// Copyright (c) 2014 neilang.com. All rights reserved. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NATiledImageDemoViewController.h" diff --git a/NAMapKit/NAAnnotation.h b/NAMapKit/NAAnnotation.h index ba83cb3..13fb35f 100644 --- a/NAMapKit/NAAnnotation.h +++ b/NAMapKit/NAAnnotation.h @@ -1,9 +1,9 @@ // -// NAAnnotation.h -// NAMapKit +// NAAnnotation.h +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import @@ -11,19 +11,32 @@ @class NAMapView; +/** + * An annotation is a point on a map. + */ @interface NAAnnotation : NSObject +// Point on the map. @property (nonatomic, assign) CGPoint point; +// Associated view, displayed on an NAMapView. @property (nonatomic, readonly) UIView *view; +// Create an annotation at a given point. +(id)annotationWithPoint:(CGPoint)point; +// Create an annotation at a given point. -(id)initWithPoint:(CGPoint)point; +// Callback invoked when adding an annotation to a map view. -(void)addToMapView:(NAMapView *)mapView animated:(BOOL)animate; +// Remove this annotation from its map view. -(void)removeFromMapView; +// Update the annotation position when zooming in or out. -(void)updatePosition; +// Override to return a custom view when the annotation is being added to a map view. -(UIView *)createViewOnMapView:(NAMapView *)mapView; +// A delegate to invoke map-specific events. @property (nonatomic, weak) NSObject *mapViewDelegate; +// Map view to which the annotation currently belongs. @property (nonatomic, readonly) NAMapView *mapView; @end diff --git a/NAMapKit/NAAnnotation.m b/NAMapKit/NAAnnotation.m index 3572ae5..6ecd00b 100644 --- a/NAMapKit/NAAnnotation.m +++ b/NAMapKit/NAAnnotation.m @@ -1,9 +1,9 @@ // -// NAAnnotation.h -// NAMapKit +// NAAnnotation.m +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAnnotation.h" diff --git a/NAMapKit/NADZTileImageDataSource.h b/NAMapKit/NADZTileImageDataSource.h index 5cb67ba..1dd8d04 100644 --- a/NAMapKit/NADZTileImageDataSource.h +++ b/NAMapKit/NADZTileImageDataSource.h @@ -1,21 +1,32 @@ // // NADZTileImageDataSource.h +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import #import "NATiledImageViewDataSource.h" +/** + * An implementation of the NATiledImageViewDataSource protocol that supports retrieving tiles from a remote HTTP server. + */ @interface NADZTileImageDataSource : NSObject +// Maximum height of the tiled image. @property (nonatomic) NSInteger maxTiledHeight; +// Maximim width of the tiled image. @property (nonatomic) NSInteger maxTiledWidth; +// Maximum tile width or height. Tiles are square except on edges. @property (nonatomic) NSInteger tileSize; +// The base URL from which to retrieve tiles. @property (nonatomic) NSURL *tileBaseURL; +// Tile format, eg. "jpg". @property (nonatomic, copy) NSString *tileFormat; +// Maximum tile level. @property (nonatomic) NSInteger maxTileLevel; +// Minimum tile level. @property (nonatomic) NSInteger minTileLevel; - (NSURL *)tiledImageView:(NATiledImageView *)imageView urlForImageTileAtLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; diff --git a/NAMapKit/NADZTileImageDataSource.m b/NAMapKit/NADZTileImageDataSource.m index fd54583..4b0f41c 100644 --- a/NAMapKit/NADZTileImageDataSource.m +++ b/NAMapKit/NADZTileImageDataSource.m @@ -1,8 +1,9 @@ // // NADZTileImageDataSource.m +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NADZTileImageDataSource.h" diff --git a/NAMapKit/NAPinAnnotation.h b/NAMapKit/NAPinAnnotation.h index 98b1469..e0f8001 100644 --- a/NAMapKit/NAPinAnnotation.h +++ b/NAMapKit/NAPinAnnotation.h @@ -1,9 +1,9 @@ // -// NAAnnotation.h -// NAMapKit +// NAPinAnnotation.h +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAAnnotation.h" @@ -14,13 +14,21 @@ typedef enum { NAPinColorPurple } NAPinColor; +/** + * An annotation that looks like a pin. + */ @interface NAPinAnnotation : NAAnnotation +// Pin color. @property (nonatomic, assign) NAPinColor color; +// Pin title. @property (nonatomic, copy) NSString *title; +// Pin subtitle. @property (nonatomic, copy) NSString *subtitle; +// Callout view that appears when the pin is tapped. @property (nonatomic, strong) UIButton *rightCalloutAccessoryView; +// Create a new pin at a point on a map. - (id)initWithPoint:(CGPoint)point; @end diff --git a/NAMapKit/NAPinAnnotation.m b/NAMapKit/NAPinAnnotation.m index 3054856..5d2f862 100644 --- a/NAMapKit/NAPinAnnotation.m +++ b/NAMapKit/NAPinAnnotation.m @@ -1,9 +1,9 @@ // -// NAAnnotation.h -// NAMapKit +// NAPinAnnotation.m +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotation.h" diff --git a/NAMapKit/NAPinAnnotationCallOutView.h b/NAMapKit/NAPinAnnotationCallOutView.h index 1bdf7e4..5e5d73c 100644 --- a/NAMapKit/NAPinAnnotationCallOutView.h +++ b/NAMapKit/NAPinAnnotationCallOutView.h @@ -1,18 +1,24 @@ // -// NACallOutView.h -// NAMapKit +// NAPinAnnotationCallOutView.h +// NAMapKit // -// Created by Neil Ang on 23/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 23/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import #import "NAPinAnnotation.h" #import "NAMapView.h" +/** + * A callout view displayed wiht NAPinAnnotation. + */ @interface NAPinAnnotationCallOutView : UIView +// Create a new callout view on a map. - (id)initOnMapView:(NAMapView *)mapView; -- (void)setAnnotation:(NAPinAnnotation *)annotation; + +// Pin annotation. +@property(nonatomic, readwrite) NAPinAnnotation *annotation; @end diff --git a/NAMapKit/NAPinAnnotationCallOutView.m b/NAMapKit/NAPinAnnotationCallOutView.m index 4f43cde..b0855b7 100644 --- a/NAMapKit/NAPinAnnotationCallOutView.m +++ b/NAMapKit/NAPinAnnotationCallOutView.m @@ -1,9 +1,9 @@ // -// NACallOutView.h -// NAMapKit +// NAPinAnnotationCallOutView.m +// NAMapKit // -// Created by Neil Ang on 23/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 23/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotationCallOutView.h" @@ -46,7 +46,7 @@ -(void)positionView:(UIView *)view posX:(float)x width:(float)width; @implementation NAPinAnnotationCallOutView -- (id)initOnMapView:(NAMapView *)mapView { +-(id)initOnMapView:(NAMapView *)mapView { self = [super init]; if (self) { UIImage *calloutBG = [[UIImage imageNamed:calloutImageBG] stretchableImageWithLeftCapWidth:0 topCapHeight:0]; @@ -68,7 +68,7 @@ - (id)initOnMapView:(NAMapView *)mapView { return self; } -- (void)setAnnotation:(NAPinAnnotation *)annotation{ +-(void)setAnnotation:(NAPinAnnotation *)annotation{ // --- RESET --- diff --git a/NAMapKit/NAPinAnnotationMapView.h b/NAMapKit/NAPinAnnotationMapView.h index b8b606b..78cdd6e 100644 --- a/NAMapKit/NAPinAnnotationMapView.h +++ b/NAMapKit/NAPinAnnotationMapView.h @@ -1,8 +1,9 @@ // // NAPinAnnotationMapView.h +// NAMapKit // // Created by Daniel Doubrovkine on 3/7/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAMapView.h" @@ -10,6 +11,9 @@ #import "NAPinAnnotationView.h" #import "NAPinAnnotationCallOutView.h" +/** + * A map view with pin annotations. + */ @interface NAPinAnnotationMapView : NAMapView @end diff --git a/NAMapKit/NAPinAnnotationMapView.m b/NAMapKit/NAPinAnnotationMapView.m index 83e5813..bc4cb5b 100644 --- a/NAMapKit/NAPinAnnotationMapView.m +++ b/NAMapKit/NAPinAnnotationMapView.m @@ -1,7 +1,9 @@ // -// NAPinAnnotationMapView.m +// NAPinAnnotationMapView.m +// NAMapKit // // Created by Daniel Doubrovkine on 3/7/14. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotationMapView.h" @@ -60,9 +62,9 @@ -(IBAction)showCallOut:(id)sender { -(void)showCalloutForAnnotation:(NAPinAnnotation *)annotation animated:(BOOL)animated { [self hideCallOut]; - [self.calloutView setAnnotation:annotation]; + self.calloutView.annotation = annotation; - [self centreOnPoint:annotation.point animated:animated]; + [self centerOnPoint:annotation.point animated:animated]; CGFloat animationDuration = animated ? calloutAnimationDuration : 0.0f; diff --git a/NAMapKit/NAPinAnnotationView.h b/NAMapKit/NAPinAnnotationView.h index 28fe3b8..80822e2 100644 --- a/NAMapKit/NAPinAnnotationView.h +++ b/NAMapKit/NAPinAnnotationView.h @@ -1,21 +1,28 @@ // -// NAPinAnnotationView.h -// NAMapKit +// NAPinAnnotationView.h +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import #import "NAPinAnnotation.h" #import "NAMapView.h" +/** + * A pin annotation view the behaves like a button. + */ @interface NAPinAnnotationView : UIButton +// Associated NAPinAnnotation. @property (nonatomic, retain) NAPinAnnotation *annotation; +// Animate the pin. @property (nonatomic, assign) BOOL animating; +// Create a view for a pin annotation on a map. -(id)initWithAnnotation:(NAPinAnnotation *)annotation onMapView:(NAMapView *)mapView; +// Update the pin position when the map is zoomed in or zoomed out. -(void)updatePosition; @end diff --git a/NAMapKit/NAPinAnnotationView.m b/NAMapKit/NAPinAnnotationView.m index 780ea8a..a172aba 100644 --- a/NAMapKit/NAPinAnnotationView.m +++ b/NAMapKit/NAPinAnnotationView.m @@ -1,9 +1,9 @@ // -// NAPinAnnotationView.h -// NAMapKit +// NAPinAnnotationView.h +// NAMapKit // -// Created by Neil Ang on 21/07/10. -// Copyright 2010 neilang.com. All rights reserved. +// Created by Neil Ang on 21/07/10. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAPinAnnotationView.h" @@ -52,9 +52,9 @@ - (void)setAnimating:(BOOL)animating{ -(void)updatePosition{ CGPoint point = [self.mapView zoomRelativePoint:self.annotation.point]; - point.x = point.x - pinPointX; - point.y = point.y - pinPointY; - self.frame = CGRectMake(point.x, point.y, pinWidth, pinHeight); + point.x = point.x - pinPointX; + point.y = point.y - pinPointY; + self.frame = CGRectMake(point.x, point.y, pinWidth, pinHeight); } @end diff --git a/NAMapKit/NATiledImageMapView.h b/NAMapKit/NATiledImageMapView.h index a70c9fe..05222b7 100644 --- a/NAMapKit/NATiledImageMapView.h +++ b/NAMapKit/NATiledImageMapView.h @@ -1,13 +1,17 @@ // // NATiledImageMapView.h +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NAMapView.h" #import "NATiledImageView.h" +/** + * A tiled image map. + */ @interface NATiledImageMapView : NAMapView - (id)initWithFrame:(CGRect)frame tiledImageDataSource:(NSObject *)dataSource; diff --git a/NAMapKit/NATiledImageMapView.m b/NAMapKit/NATiledImageMapView.m index 9a92138..8f51735 100644 --- a/NAMapKit/NATiledImageMapView.m +++ b/NAMapKit/NATiledImageMapView.m @@ -1,8 +1,9 @@ // // NATiledImageMapView.m +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NATiledImageMapView.h" @@ -86,19 +87,6 @@ -(void)scrollViewDidZoom:(UIScrollView *)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; } } diff --git a/NAMapKit/NATiledImageView.h b/NAMapKit/NATiledImageView.h index 0e22d2b..8c76d8c 100644 --- a/NAMapKit/NATiledImageView.h +++ b/NAMapKit/NATiledImageView.h @@ -1,17 +1,28 @@ // -// NATiledImageView -// Created by orta on 2014/01/30. +// NATiledImageView.h +// NAMapKit +// +// Created by orta on 2014/01/30. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NATiledImageViewDataSource.h" +/** + * A tiled image view. + */ @interface NATiledImageView : UIView +// Initialize with a data source. - (id)initWithDataSource:(NSObject *)dataSource; +// Cancel any pending tile downloads. +- (void)cancelConcurrentDownloads; +// Tiled images data source. @property (readonly, nonatomic) NSObject *dataSource; +// Display tiled borders for debugging. @property (readwrite, nonatomic, assign) BOOL displayTileBorders; +// Current image zoom level. @property (readonly, nonatomic) NSInteger currentZoomLevel; -- (void)cancelConcurrentDownloads; @end \ No newline at end of file diff --git a/NAMapKit/NATiledImageView.m b/NAMapKit/NATiledImageView.m index bcb1470..835608e 100644 --- a/NAMapKit/NATiledImageView.m +++ b/NAMapKit/NATiledImageView.m @@ -1,6 +1,9 @@ // // NATiledImageView.m +// NAMapKit +// // Created by Orta Therox on 2014/01/29. +// Copyright (c) 2010-14 neilang.com. All rights reserved. // #import "NATiledImageView.h" diff --git a/NAMapKit/NATiledImageViewDataSource.h b/NAMapKit/NATiledImageViewDataSource.h index bf5c127..1ebf348 100644 --- a/NAMapKit/NATiledImageViewDataSource.h +++ b/NAMapKit/NATiledImageViewDataSource.h @@ -1,21 +1,88 @@ // // NATiledImageDataSource.h +// NAMapKit // // Created by Daniel Doubrovkine on 3/10/14. -// +// Copyright (c) 2010-14 neilang.com. All rights reserved. // @class NATiledImageView; +/** + * An NATiledMapView data source. + */ @protocol NATiledImageViewDataSource + +/** + * Return a UIImage for a tile, if available, for example from local storage. + * + * @param imageView Tiled image view. + * @param level Zoom level. + * @param x X coordinate of the tile. + * @param y Y coordinate of the tile. + * + * @return A UIImage of the tile, when available, otherwise nil. + */ - (UIImage *)tiledImageView:(NATiledImageView *)imageView imageTileForLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; + +/** + * Tile size. + * + * @param imageView Tiled image view. + * + * @return CGSize of a single tile. + */ - (CGSize)tileSizeForImageView:(NATiledImageView *)imageView; + +/** + * Size of the full, zoomed in, tiled image. + * + * @param imageView Tiled image view. + * + * @return CGSize of a full image. + */ - (CGSize)imageSizeForImageView:(NATiledImageView *)imageView; + +/** + * Minimum zoom level. + * + * @param imageView Tiled image view. + * + * @return Minimum zoom level. + */ - (NSInteger)minimumImageZoomLevelForImageView:(NATiledImageView *)imageView; + +/** + * Maximum zoom level. + * + * @param imageView Tiled image view. + * + * @return Maximum zoom level. + */ - (NSInteger)maximumImageZoomLevelForImageView:(NATiledImageView *)imageView; @optional + +/** + * Return an URL for an image tile. + * + * @param imageView Tiled image view. + * @param level Zoom level. + * @param x X coordinate of the tile. + * @param y Y coordinate of the tile. + * + * @return An NSURL where the tile can be downloaded from. + */ - (NSURL *)tiledImageView:(NATiledImageView *)imageView urlForImageTileAtLevel:(NSInteger)level x:(NSInteger)x y:(NSInteger)y; + +/** + * Callback when an image tile has been downloaded. Use this method to cache tiles in local storage, for example. + * + * @param imageView Tiled image view. + * @param image UIImage of the tile. + * @param url URL from which the tile has been downloaded. + */ - (void)tiledImageView:(NATiledImageView *)imageView didDownloadTiledImage:(UIImage *)image atURL:(NSURL *)url; + @end From 2f3823ba92be500f19a39d96761848ce1e689784 Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 12:54:52 -0400 Subject: [PATCH 5/7] Synchronize operations. --- NAMapKit/NATiledImageView.m | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/NAMapKit/NATiledImageView.m b/NAMapKit/NATiledImageView.m index 835608e..f43c361 100644 --- a/NAMapKit/NATiledImageView.m +++ b/NAMapKit/NATiledImageView.m @@ -198,7 +198,9 @@ -(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs } } - [sself.downloadOperations removeObjectForKey:tileURL]; + @synchronized(sself.downloadOperations) { + [sself.downloadOperations removeObjectForKey:tileURL]; + } }; if ([NSThread isMainThread]) { @@ -208,7 +210,9 @@ -(void)downloadAndRedrawTilesWithURLs:(NSArray *)arrayOfURLs } }]; - [self.downloadOperations setObject:operation forKey:tileURL]; + @synchronized(self.downloadOperations) { + [self.downloadOperations setObject:operation forKey:tileURL]; + } } } @@ -220,13 +224,15 @@ -(void)dealloc -(void)cancelConcurrentDownloads { - for(id operation in self.downloadOperations.objectEnumerator) { - if (operation) { - [operation cancel]; + @synchronized(self.downloadOperations) { + for(id operation in self.downloadOperations.objectEnumerator) { + if (operation) { + [operation cancel]; + } } + + [self.downloadOperations removeAllObjects]; } - - _downloadOperations = nil; } @end \ No newline at end of file From 2eb0b20080ef06efa51dc728f2ff41a6356dbd8f Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 13:08:09 -0400 Subject: [PATCH 6/7] Use CGFloat/NSInteger insetead of float/integer. Cleaned up interactive demo a bit. --- Demo/Demo/NAInteractiveDemoViewController.m | 55 ++++++++++----------- NAMapKit/NAMapView.m | 12 ++--- NAMapKit/NAPinAnnotationCallOutView.m | 32 ++++++------ 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/Demo/Demo/NAInteractiveDemoViewController.m b/Demo/Demo/NAInteractiveDemoViewController.m index 82eee4c..a5a4c87 100644 --- a/Demo/Demo/NAInteractiveDemoViewController.m +++ b/Demo/Demo/NAInteractiveDemoViewController.m @@ -9,11 +9,9 @@ #import "NAInteractiveDemoViewController.h" #import "NAPinAnnotation.h" -@interface NAInteractiveDemoViewController (){ - int _count; - NAPinAnnotation *_lastFocused; -} +@interface NAInteractiveDemoViewController () @property (nonatomic, strong) NSMutableArray *annotations; +@property(nonatomic) NAPinAnnotation * lastFocused; @property (nonatomic, assign) CGSize size; @property (weak, nonatomic) IBOutlet UILabel *zoomLevelLabel; @property (weak, nonatomic) IBOutlet UILabel *selectedPinLabel; @@ -38,15 +36,12 @@ -(void)viewDidLoad self.selectedPinLabel.text = @""; self.size = image.size; - - _count = 0; - _lastFocused = nil; } -(IBAction)addPin:(id)sender{ - int x = (arc4random() % (int)self.size.width); - int y = (arc4random() % (int)self.size.width); + NSInteger x = (arc4random() % (int)self.size.width); + NSInteger y = (arc4random() % (int)self.size.width); CGPoint point = CGPointMake(x, y); @@ -58,46 +53,46 @@ -(void)addPinAt:(CGPoint)point withColor:(NAPinColor)color{ [self.mapView centerOnPoint:point animated:YES]; NAPinAnnotation *annotation = [NAPinAnnotation annotationWithPoint:point]; - - annotation.title = [NSString stringWithFormat:@"Pin %d", ++_count]; - + annotation.title = [NSString stringWithFormat:@"Pin %d", self.annotations.count + 1]; annotation.color = color; [self.mapView addAnnotation:annotation animated:YES]; - [self.annotations addObject:annotation]; _lastFocused = annotation; - } -(IBAction)removePin:(id)sender{ + if(self.annotations.count <= 0 || self.lastFocused == nil) return; + [self.mapView centerOnPoint:self.lastFocused.point animated:YES]; + [self.mapView removeAnnotation:self.lastFocused]; + [self.annotations removeObject:self.lastFocused]; + self.lastFocused = self.annotations.lastObject; +} - if([self.annotations count] <= 0 || _lastFocused == nil) return; - - [self.mapView centerOnPoint:_lastFocused.point animated:YES]; +-(IBAction)selectRandom:(id)sender{ + if(self.annotations.count <= 0) return; - [self.mapView removeAnnotation:_lastFocused]; + NSInteger rand = (arc4random() % (int)self.annotations.count); - [self.annotations removeObject:_lastFocused]; + NAPinAnnotation *annotation = [self.annotations objectAtIndex:rand]; + if (annotation == self.lastFocused && self.annotations.count > 1) { + rand = ((rand + 1) % (int)self.annotations.count); + annotation = [self.annotations objectAtIndex:rand]; + } - _lastFocused = ([self.annotations count] > 0) ? [self.annotations objectAtIndex:[self.annotations count]-1] : nil; + [self selectPin:annotation]; } --(IBAction)selectRandom:(id)sender{ - if([self.annotations count] <= 0) return; - - int rand = (arc4random() % (int)[self.annotations count]); - [self selectPinAt:rand]; +-(void)selectPinAt:(NSInteger)index +{ + [self selectPin:[self.annotations objectAtIndex:index]]; } --(void)selectPinAt:(NSInteger)index{ - NAPinAnnotation *annotation = [self.annotations objectAtIndex:index]; - +-(void)selectPin:(NAPinAnnotation *)annotation +{ self.selectedPinLabel.text = [NSString stringWithFormat:@"%@", annotation.title]; - [self.mapView selectAnnotation:annotation animated:YES]; - _lastFocused = annotation; } diff --git a/NAMapKit/NAMapView.m b/NAMapKit/NAMapView.m index 93c9202..dbf565c 100644 --- a/NAMapKit/NAMapView.m +++ b/NAMapKit/NAMapView.m @@ -93,15 +93,15 @@ -(void)removeAnnotation:(NAAnnotation *)annotation { } - (void)centerOnPoint:(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); + CGFloat x = (point.x * self.zoomScale) - (self.frame.size.width / 2.0f); + CGFloat 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{ - float x = (self.contentSize.width / self.originalSize.width) * point.x; - float y = (self.contentSize.height / self.originalSize.height) * point.y; + CGFloat x = (self.contentSize.width / self.originalSize.width) * point.x; + CGFloat y = (self.contentSize.height / self.originalSize.height) * point.y; return CGPointMake(round(x), round(y)); } @@ -140,13 +140,13 @@ -(CGFloat)zoomLevel -(void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { // double tap zooms in, but returns to normal zoom level if it reaches max zoom - float newScale = self.zoomScale >= self.maximumZoomScale ? self.minimumZoomScale : self.zoomScale * self.zoomStep; + CGFloat newScale = self.zoomScale >= self.maximumZoomScale ? self.minimumZoomScale : self.zoomScale * self.zoomStep; [self setZoomScale:newScale animated:YES]; } -(void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer { // two-finger tap zooms out, but returns to normal zoom level if it reaches min zoom - float newScale = self.zoomScale <= self.minimumZoomScale ? self.maximumZoomScale : self.zoomScale / self.zoomStep; + CGFloat newScale = self.zoomScale <= self.minimumZoomScale ? self.maximumZoomScale : self.zoomScale / self.zoomStep; [self setZoomScale:newScale animated:YES]; } diff --git a/NAMapKit/NAPinAnnotationCallOutView.m b/NAMapKit/NAPinAnnotationCallOutView.m index b0855b7..3ac4541 100644 --- a/NAMapKit/NAPinAnnotationCallOutView.m +++ b/NAMapKit/NAPinAnnotationCallOutView.m @@ -82,15 +82,15 @@ -(void)setAnnotation:(NAPinAnnotation *)annotation{ self.position = annotation.point; - float leftCapWidth = self.calloutLeftCapView.image.size.width; - float rightCapWidth = self.calloutRightCapView.image.size.width; - float anchorWidth = self.calloutAnchorView.image.size.width; - float anchorHeight = self.calloutAnchorView.image.size.height; - float maxWidth = self.mapView.frame.size.width; + CGFloat leftCapWidth = self.calloutLeftCapView.image.size.width; + CGFloat rightCapWidth = self.calloutRightCapView.image.size.width; + CGFloat anchorWidth = self.calloutAnchorView.image.size.width; + CGFloat anchorHeight = self.calloutAnchorView.image.size.height; + CGFloat maxWidth = self.mapView.frame.size.width; // --- FRAME --- - float middleWidth = anchorWidth; + CGFloat middleWidth = anchorWidth; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -116,7 +116,7 @@ -(void)setAnnotation:(NAPinAnnotation *)annotation{ middleWidth = MIN(maxWidth, middleWidth); - float totalWidth = middleWidth + leftCapWidth + rightCapWidth; + CGFloat totalWidth = middleWidth + leftCapWidth + rightCapWidth; self.point = annotation.point; @@ -125,7 +125,7 @@ -(void)setAnnotation:(NAPinAnnotation *)annotation{ // --- IMAGEVIEWS --- - float centreOffsetWidth = (middleWidth - anchorWidth) / 2.0f; + CGFloat centreOffsetWidth = (middleWidth - anchorWidth) / 2.0f; [self positionView:self.calloutLeftCapView posX:0.0f]; [self positionView:self.calloutRightCapView posX:(totalWidth - rightCapWidth)]; @@ -143,13 +143,13 @@ -(void)setAnnotation:(NAPinAnnotation *)annotation{ [self addSubview:self.calloutRightCenterView]; } - float labelWidth = middleWidth; + CGFloat labelWidth = middleWidth; // --- RIGHT ACCESSORY VIEW --- if (annotation.rightCalloutAccessoryView) { - float accesoryWidth = annotation.rightCalloutAccessoryView.frame.size.width; - float x = middleWidth - accesoryWidth + leftCapWidth + rightAccessoryLeftOffset; + CGFloat accesoryWidth = annotation.rightCalloutAccessoryView.frame.size.width; + CGFloat x = middleWidth - accesoryWidth + leftCapWidth + rightAccessoryLeftOffset; CGRect frame = annotation.rightCalloutAccessoryView.frame; frame.origin.x = x; @@ -163,9 +163,9 @@ -(void)setAnnotation:(NAPinAnnotation *)annotation{ // --- LABELS --- - float currentTitleTopOffset = titleStandaloneTopOffset; - float currentTitleLabelHeight = titleStandaloneLabelHeight; - float currentTitleFontSize = titleStandaloneFontSize; + CGFloat currentTitleTopOffset = titleStandaloneTopOffset; + CGFloat currentTitleLabelHeight = titleStandaloneLabelHeight; + CGFloat currentTitleFontSize = titleStandaloneFontSize; // --- SUBTITLE --- @@ -199,8 +199,8 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N -(void)updatePosition{ CGPoint point = [self.mapView zoomRelativePoint:self.position]; - float xPos = point.x - (self.frame.size.width / 2.0f); - float yPos = point.y - (self.frame.size.height) - anchorYOffset; + CGFloat xPos = point.x - (self.frame.size.width / 2.0f); + CGFloat yPos = point.y - (self.frame.size.height) - anchorYOffset; self.frame = CGRectMake(floor(xPos), yPos, self.frame.size.width, self.frame.size.height); } From e388d7fdcdbf6e2ab3d346092ea08a1acd8a1424 Mon Sep 17 00:00:00 2001 From: dblock Date: Fri, 14 Mar 2014 13:36:35 -0400 Subject: [PATCH 7/7] Zoom will pan towards the point being tapped. --- NAMapKit/NAMapView.m | 24 ++++++++++++++++++++++-- NAMapKit/NATiledImageMapView.m | 24 +++++++++++------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/NAMapKit/NAMapView.m b/NAMapKit/NAMapView.m index dbf565c..57391c0 100644 --- a/NAMapKit/NAMapView.m +++ b/NAMapKit/NAMapView.m @@ -140,8 +140,28 @@ -(CGFloat)zoomLevel -(void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { // double tap zooms in, but returns to normal zoom level if it reaches max zoom - CGFloat newScale = self.zoomScale >= self.maximumZoomScale ? self.minimumZoomScale : self.zoomScale * self.zoomStep; - [self setZoomScale:newScale animated:YES]; + if (self.zoomScale >= self.maximumZoomScale) { + [self setZoomScale:self.minimumZoomScale animated:YES]; + } else { + // the location tapped becomes the new center + CGPoint tapCenter = [gestureRecognizer locationInView:self.imageView]; + CGFloat newScale = MIN(self.zoomScale * self.zoomStep, self.maximumZoomScale); + CGRect maxZoomRect = [self rectAroundPoint:tapCenter atZoomScale:newScale]; + [self zoomToRect:maxZoomRect animated:YES]; + } +} + +- (CGRect)rectAroundPoint:(CGPoint)point atZoomScale:(CGFloat)zoomScale { + // define the shape of the zoom rect + CGSize boundsSize = self.bounds.size; + // modify the size according to the requested zoom level + // for example, if we're zooming in to 0.5 zoom, then this will increase the bounds size by a factor of two + CGSize scaledBoundsSize = CGSizeMake(boundsSize.width / zoomScale, boundsSize.height / zoomScale); + + return CGRectMake(point.x - scaledBoundsSize.width / 2, + point.y - scaledBoundsSize.height / 2, + scaledBoundsSize.width, + scaledBoundsSize.height); } -(void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer { diff --git a/NAMapKit/NATiledImageMapView.m b/NAMapKit/NATiledImageMapView.m index 8f51735..5744d67 100644 --- a/NAMapKit/NATiledImageMapView.m +++ b/NAMapKit/NATiledImageMapView.m @@ -11,7 +11,7 @@ @interface NATiledImageMapView () @property (nonatomic, weak, readonly) NSObject *dataSource; -@property (nonatomic, readonly) NATiledImageView *tiledImageView; +@property (nonatomic, readonly) NATiledImageView *imageView; @property (nonatomic, readonly) UIImageView *backgroundImageView; @end @@ -30,9 +30,9 @@ - (id)initWithFrame:(CGRect)frame tiledImageDataSource:(NSObject