diff --git a/Demo/AppDelegate.h b/Demo/AppDelegate.h deleted file mode 100644 index 541eac2..0000000 --- a/Demo/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// JPSThumbnailAnnotationView -// -// Created by Jean-Pierre Simard on 4/21/13. -// Copyright (c) 2013 JP Simard. All rights reserved. -// - -@import UIKit; - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Demo/AppDelegate.m b/Demo/AppDelegate.m deleted file mode 100644 index 521d0f3..0000000 --- a/Demo/AppDelegate.m +++ /dev/null @@ -1,21 +0,0 @@ -// -// AppDelegate.m -// JPSThumbnailAnnotationView -// -// Created by Jean-Pierre Simard on 4/21/13. -// Copyright (c) 2013 JP Simard. All rights reserved. -// - -#import "AppDelegate.h" -#import "ViewController.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - self.window.rootViewController = [[ViewController alloc] init]; - [self.window makeKeyAndVisible]; - return YES; -} - -@end diff --git a/Demo/AppDelegate.swift b/Demo/AppDelegate.swift new file mode 100644 index 0000000..44d6bdf --- /dev/null +++ b/Demo/AppDelegate.swift @@ -0,0 +1,22 @@ +// +// AppDelegate.swift +// JPSThumbnailAnnotation +// +// Created by JP Simard on 5/1/15. +// Copyright (c) 2015 JP Simard. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { + window = UIWindow(frame: UIScreen.mainScreen().bounds) + window?.rootViewController = ViewController() + window?.makeKeyAndVisible() + return true + } +} diff --git a/Demo/JPSThumbnailAnnotation-Bridging-Header.h b/Demo/JPSThumbnailAnnotation-Bridging-Header.h new file mode 100644 index 0000000..b6807d2 --- /dev/null +++ b/Demo/JPSThumbnailAnnotation-Bridging-Header.h @@ -0,0 +1,5 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "JPSThumbnailAnnotation.h" diff --git a/Demo/JPSThumbnailAnnotation.xcodeproj/project.pbxproj b/Demo/JPSThumbnailAnnotation.xcodeproj/project.pbxproj index df9f908..ebad046 100644 --- a/Demo/JPSThumbnailAnnotation.xcodeproj/project.pbxproj +++ b/Demo/JPSThumbnailAnnotation.xcodeproj/project.pbxproj @@ -9,12 +9,11 @@ /* Begin PBXBuildFile section */ E875D68A17245D6C00009A6F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E875D68917245D6C00009A6F /* Foundation.framework */; }; E875D69217245D6C00009A6F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E875D69017245D6C00009A6F /* InfoPlist.strings */; }; - E875D69417245D6C00009A6F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E875D69317245D6C00009A6F /* main.m */; }; - E875D69817245D6C00009A6F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E875D69717245D6C00009A6F /* AppDelegate.m */; }; E875D69A17245D6C00009A6F /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = E875D69917245D6C00009A6F /* Default.png */; }; E875D69C17245D6C00009A6F /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E875D69B17245D6C00009A6F /* Default@2x.png */; }; E875D69E17245D6C00009A6F /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E875D69D17245D6C00009A6F /* Default-568h@2x.png */; }; - E875D6A117245D6C00009A6F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E875D6A017245D6C00009A6F /* ViewController.m */; }; + E89697061AF416DC002F307F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89697051AF416DC002F307F /* AppDelegate.swift */; }; + E89697081AF41770002F307F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89697071AF41770002F307F /* ViewController.swift */; }; E8B7E7D91724669200E93E96 /* JPSThumbnailAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B7E7D81724669200E93E96 /* JPSThumbnailAnnotation.m */; }; E8B7E7DC172466B600E93E96 /* JPSThumbnailAnnotationView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B7E7DB172466B600E93E96 /* JPSThumbnailAnnotationView.m */; }; E8EF4F2A1724EE840051DB36 /* JPSThumnail.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EF4F291724EE840051DB36 /* JPSThumnail.m */; }; @@ -30,16 +29,14 @@ E875D68B17245D6C00009A6F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; E875D68F17245D6C00009A6F /* JPSThumbnailAnnotation-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "JPSThumbnailAnnotation-Info.plist"; sourceTree = ""; }; E875D69117245D6C00009A6F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - E875D69317245D6C00009A6F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; E875D69517245D6C00009A6F /* JPSThumbnailAnnotation-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JPSThumbnailAnnotation-Prefix.pch"; sourceTree = ""; }; - E875D69617245D6C00009A6F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - E875D69717245D6C00009A6F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; E875D69917245D6C00009A6F /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; E875D69B17245D6C00009A6F /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; E875D69D17245D6C00009A6F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - E875D69F17245D6C00009A6F /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - E875D6A017245D6C00009A6F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; E875D6AA172461FB00009A6F /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; + E89697041AF416DB002F307F /* JPSThumbnailAnnotation-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JPSThumbnailAnnotation-Bridging-Header.h"; sourceTree = ""; }; + E89697051AF416DC002F307F /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E89697071AF41770002F307F /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; E8B7E7D71724669200E93E96 /* JPSThumbnailAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JPSThumbnailAnnotation.h; sourceTree = ""; }; E8B7E7D81724669200E93E96 /* JPSThumbnailAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JPSThumbnailAnnotation.m; sourceTree = ""; }; E8B7E7DA172466B600E93E96 /* JPSThumbnailAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JPSThumbnailAnnotationView.h; sourceTree = ""; }; @@ -99,11 +96,10 @@ E875D68D17245D6C00009A6F /* Classes */ = { isa = PBXGroup; children = ( - E875D69617245D6C00009A6F /* AppDelegate.h */, - E875D69717245D6C00009A6F /* AppDelegate.m */, - E875D69F17245D6C00009A6F /* ViewController.h */, - E875D6A017245D6C00009A6F /* ViewController.m */, E875D68E17245D6C00009A6F /* Supporting Files */, + E89697051AF416DC002F307F /* AppDelegate.swift */, + E89697071AF41770002F307F /* ViewController.swift */, + E89697041AF416DB002F307F /* JPSThumbnailAnnotation-Bridging-Header.h */, ); name = Classes; sourceTree = SOURCE_ROOT; @@ -116,7 +112,6 @@ E8EF4F2B1725027D0051DB36 /* empire.jpg */, E875D68F17245D6C00009A6F /* JPSThumbnailAnnotation-Info.plist */, E875D69017245D6C00009A6F /* InfoPlist.strings */, - E875D69317245D6C00009A6F /* main.m */, E875D69517245D6C00009A6F /* JPSThumbnailAnnotation-Prefix.pch */, E875D69917245D6C00009A6F /* Default.png */, E875D69B17245D6C00009A6F /* Default@2x.png */, @@ -208,10 +203,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E875D69417245D6C00009A6F /* main.m in Sources */, - E875D69817245D6C00009A6F /* AppDelegate.m in Sources */, - E875D6A117245D6C00009A6F /* ViewController.m in Sources */, E8B7E7D91724669200E93E96 /* JPSThumbnailAnnotation.m in Sources */, + E89697061AF416DC002F307F /* AppDelegate.swift in Sources */, + E89697081AF41770002F307F /* ViewController.swift in Sources */, E8B7E7DC172466B600E93E96 /* JPSThumbnailAnnotationView.m in Sources */, E8EF4F2A1724EE840051DB36 /* JPSThumnail.m in Sources */, ); @@ -294,7 +288,11 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JPSThumbnailAnnotation-Prefix.pch"; INFOPLIST_FILE = "JPSThumbnailAnnotation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = JPSThumbnailAnnotation; + SWIFT_OBJC_BRIDGING_HEADER = "JPSThumbnailAnnotation-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; @@ -307,7 +305,10 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "JPSThumbnailAnnotation-Prefix.pch"; INFOPLIST_FILE = "JPSThumbnailAnnotation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = JPSThumbnailAnnotation; + SWIFT_OBJC_BRIDGING_HEADER = "JPSThumbnailAnnotation-Bridging-Header.h"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; diff --git a/Demo/ViewController.h b/Demo/ViewController.h deleted file mode 100644 index ef34889..0000000 --- a/Demo/ViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ViewController.h -// JPSThumbnailAnnotationView -// -// Created by Jean-Pierre Simard on 4/21/13. -// Copyright (c) 2013 JP Simard. All rights reserved. -// - -@import UIKit; - -@interface ViewController : UIViewController - -@end diff --git a/Demo/ViewController.m b/Demo/ViewController.m deleted file mode 100644 index f422c3f..0000000 --- a/Demo/ViewController.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// ViewController.m -// JPSThumbnailAnnotationView -// -// Created by Jean-Pierre Simard on 4/21/13. -// Copyright (c) 2013 JP Simard. All rights reserved. -// - -@import MapKit; -#import "ViewController.h" -#import "JPSThumbnailAnnotation.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - // Map View - MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; - mapView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - mapView.delegate = self; - [self.view addSubview:mapView]; - - // Annotations - [mapView addAnnotations:[self annotations]]; -} - -- (NSArray *)annotations { - // Empire State Building - JPSThumbnail *empire = [[JPSThumbnail alloc] init]; - empire.image = [UIImage imageNamed:@"empire.jpg"]; - empire.title = @"Empire State Building"; - empire.subtitle = @"NYC Landmark"; - empire.coordinate = CLLocationCoordinate2DMake(40.75f, -73.99f); - empire.disclosureBlock = ^{ NSLog(@"selected Empire"); }; - - // Apple HQ - JPSThumbnail *apple = [[JPSThumbnail alloc] init]; - apple.image = [UIImage imageNamed:@"apple.jpg"]; - apple.title = @"Apple HQ"; - apple.subtitle = @"Apple Headquarters"; - apple.coordinate = CLLocationCoordinate2DMake(37.33f, -122.03f); - apple.disclosureBlock = ^{ NSLog(@"selected Appple"); }; - - // Parliament of Canada - JPSThumbnail *ottawa = [[JPSThumbnail alloc] init]; - ottawa.image = [UIImage imageNamed:@"ottawa.jpg"]; - ottawa.title = @"Parliament of Canada"; - ottawa.subtitle = @"Oh Canada!"; - ottawa.coordinate = CLLocationCoordinate2DMake(45.43f, -75.70f); - ottawa.disclosureBlock = ^{ NSLog(@"selected Ottawa"); }; - - return @[[JPSThumbnailAnnotation annotationWithThumbnail:empire], - [JPSThumbnailAnnotation annotationWithThumbnail:apple], - [JPSThumbnailAnnotation annotationWithThumbnail:ottawa]]; -} - -#pragma mark - MKMapViewDelegate - -- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { - if ([view conformsToProtocol:@protocol(JPSThumbnailAnnotationViewProtocol)]) { - [((NSObject *)view) didSelectAnnotationViewInMap:mapView]; - } -} - -- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { - if ([view conformsToProtocol:@protocol(JPSThumbnailAnnotationViewProtocol)]) { - [((NSObject *)view) didDeselectAnnotationViewInMap:mapView]; - } -} - -- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation { - if ([annotation conformsToProtocol:@protocol(JPSThumbnailAnnotationProtocol)]) { - return [((NSObject *)annotation) annotationViewInMap:mapView]; - } - return nil; -} - -@end diff --git a/Demo/ViewController.swift b/Demo/ViewController.swift new file mode 100644 index 0000000..7b6ecce --- /dev/null +++ b/Demo/ViewController.swift @@ -0,0 +1,70 @@ +// +// ViewController.swift +// JPSThumbnailAnnotation +// +// Created by JP Simard on 5/1/15. +// Copyright (c) 2015 JP Simard. All rights reserved. +// + +import UIKit +import MapKit + +class ViewController: UIViewController, MKMapViewDelegate { + + var annotations: [JPSThumbnailAnnotation] { + // Empire State Building + let empire = JPSThumbnail() + empire.image = UIImage(named: "empire.jpg") + empire.title = "Empire State Building" + empire.subtitle = "NYC Landmark" + empire.coordinate = CLLocationCoordinate2DMake(40.75, -73.99) + empire.disclosureBlock = { println("selected Empire") } + + // Apple HQ + let apple = JPSThumbnail() + apple.image = UIImage(named: "apple.jpg") + apple.title = "Apple HQ" + apple.subtitle = "Apple Headquarters" + apple.coordinate = CLLocationCoordinate2DMake(37.33, -122.03) + apple.disclosureBlock = { println("selected Apple") } + + // Parliament of Canada + let ottawa = JPSThumbnail() + ottawa.image = UIImage(named: "ottawa.jpg") + ottawa.title = "Parliament of Canada" + ottawa.subtitle = "Oh Canada!" + ottawa.coordinate = CLLocationCoordinate2DMake(45.43, -75.70) + ottawa.disclosureBlock = { println("selected Ottawa") } + + return [empire, apple, ottawa].map { + JPSThumbnailAnnotation(thumbnail: $0) + } + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Map View + let mapView = MKMapView(frame: view.bounds) + mapView.autoresizingMask = .FlexibleHeight | .FlexibleWidth + mapView.delegate = self + view.addSubview(mapView) + + // Annotations + mapView.addAnnotations(annotations) + } + + // MARK: MKMapViewDelegate + + func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) { + (view as? JPSThumbnailAnnotationViewProtocol)?.didSelectAnnotationViewInMap(mapView) + } + + func mapView(mapView: MKMapView!, didDeselectAnnotationView view: MKAnnotationView!) { + (view as? JPSThumbnailAnnotationViewProtocol)?.didDeselectAnnotationViewInMap(mapView) + } + + func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { + return (annotation as? JPSThumbnailAnnotationProtocol)?.annotationViewInMap(mapView) + } +} diff --git a/Demo/main.m b/Demo/main.m deleted file mode 100644 index bf2f87b..0000000 --- a/Demo/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// JPSThumbnailAnnotationView -// -// Created by Jean-Pierre Simard on 4/21/13. -// Copyright (c) 2013 JP Simard. All rights reserved. -// - -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -}