ProMotion-map 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: edd818066a99f0ab90ba913a19ea359e555b3b4f
4
- data.tar.gz: cffef6478e20af2f336d449acd51385bb9eafdc0
3
+ metadata.gz: 4fa9190c3b59430b670b821061b1e100bca8a170
4
+ data.tar.gz: 68afd534d7381b9814866693a00dbd09f39ad65a
5
5
  SHA512:
6
- metadata.gz: 10066d1c96a8dec11416aefc77d766cf8a484c5bf279f728f0bbe02eede4a57835ebc05f0719d2ddedb7d67ca3d7dfac3aae4ac1cd342ff92bbba7cb3fabe134
7
- data.tar.gz: 2451e7c00956b3109b5fd8caa7317b6e9f457fabf1d2f476ad81ce85e2dfaf11fa2aa8d92124d5d7193ae1c0480f6cac78cd66402f2261bc995df8a35b1051b8
6
+ metadata.gz: 1378133321b46f3bdf9d36aad3c4a07dcc89195a56db40e412a30d9a6f0583c17f3e7dbc4a629821df4265bcb28d99b7272c575f6aed3a4cf5988c44f0b76f65
7
+ data.tar.gz: 25a582239c97133ac7027dbe71f52f1bb05b50c440c615f667708f706dd090bcbe4fbfacda512a8492162db66e4a2f61ee77dd96387bd99d280084b446a46147
data/README.md CHANGED
@@ -21,6 +21,7 @@ Easily create a map screen, complete with annotations.
21
21
  class MyMapScreen < PM::MapScreen
22
22
  title "My Map"
23
23
  start_position latitude: 35.090648651123, longitude: -82.965972900391, radius: 4
24
+ tap_to_add
24
25
 
25
26
  def annotation_data
26
27
  [{
@@ -54,8 +55,7 @@ class MyMapScreen < PM::MapScreen
54
55
  your_param: "CustomWhatever",
55
56
  action: :show_forest
56
57
  }, {
57
- longitude: -82.965972900391,
58
- latitude: 35.090648651123,
58
+ coordinate: CLLocationCoordinate2DMake(35.090648651123, -82.965972900391)
59
59
  title: "Rainbow Falls",
60
60
  subtitle: "Nantahala National Forest",
61
61
  image: UIImage.imageNamed("custom-pin"),
@@ -91,8 +91,13 @@ All possible properties:
91
91
 
92
92
  ```ruby
93
93
  {
94
- longitude: -82.956244328014, # REQUIRED
95
- latitude: 35.085548421623, # REQUIRED
94
+ # REQUIRED -or- use :coordinate
95
+ longitude: -82.956244328014,
96
+ latitude: 35.085548421623,
97
+
98
+ # REQUIRED -or- use :longitude & :latitude
99
+ coordinate: CLLocationCoordinate2DMake(35.085548421623, -82.956244328014)
100
+
96
101
  title: "Stairway Falls", # REQUIRED
97
102
  subtitle: "Gorges State Park",
98
103
  image: "my_custom_image",
@@ -103,7 +108,7 @@ All possible properties:
103
108
  }
104
109
  ```
105
110
 
106
- You may pass whatever properties you want in the annotation hash, but `:longitude`, `:latitude`, and `:title` are required.
111
+ You may pass whatever properties you want in the annotation hash, but (`:longitude` && `:latitude` || `:coordinate`), and `:title` are required.
107
112
 
108
113
  Use `:image` to specify a custom image. Pass in a string to conserve memory and it will be converted using `UIImage.imageNamed(your_string)`. If you pass in a `UIImage`, we'll use that, but keep in mind that there will be another unnecessary copy of the UIImage in memory.
109
114
 
@@ -131,7 +136,22 @@ Sets the center of the map. `animated` property defaults to `true`.
131
136
 
132
137
  #### show_user_location
133
138
 
134
- Shows the user's location on the map.
139
+ Shows the user's location on the map. Must be called in the view initialization sequence on `will_appear` or _after_.
140
+
141
+ #### look_up_location(CLLocation) { |placemark, error| }
142
+
143
+ This method takes a CLLocation object and will return one to many CLPlacemark to represent nearby data.
144
+
145
+ ##### iOS 8 Location Requirements
146
+
147
+ iOS 8 introduced stricter location services requirements. You are now required to add a few key/value pairs to the `Info.plist`. Add these two lines to your `Rakefile` (with your descriptions, obviously):
148
+
149
+ ```ruby
150
+ app.info_plist['NSLocationAlwaysUsageDescription'] = 'Description'
151
+ app.info_plist['NSLocationWhenInUseUsageDescription'] = 'Description'
152
+ ```
153
+
154
+ *Note: you need both keys to use `get_once`, so it's probably best to just include both no matter what.* See [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW18) on iOS 8 location services requirements for more information.
135
155
 
136
156
  #### hide_user_location
137
157
 
@@ -216,6 +236,75 @@ end
216
236
 
217
237
  `radius` is the zoom level of the map in miles (default: 10).
218
238
 
239
+ #### tap_to_add(length: Float, target: Object, action: Selector, annotation: Hash)
240
+
241
+ Lets a user long press the map to drop an annotation where they pressed.
242
+
243
+ ##### Default values:
244
+
245
+ You can override any of these values. The `annotation` parameter can take any options specified in the annotation documentation above except `:latitude`, `:longitude`, and `:coordinate`.
246
+
247
+ ```ruby
248
+ length: 2.0,
249
+ target: self,
250
+ action: "gesture_drop_pin:",
251
+ annotation: {
252
+ title: "Dropped Pin",
253
+ animates_drop: true
254
+ }
255
+ ```
256
+
257
+ ##### Notifications
258
+
259
+ This feature posts two different `NSNotificationCenter` notifications:
260
+
261
+ **ProMotionMapWillAddPin:** Fired the moment the long press gesture is recognized, before the pin is added.
262
+
263
+ **ProMotionMapAddedPin:** Fired after the pin has been added to the map.
264
+
265
+ ##### Example:
266
+
267
+ ```ruby
268
+ # Simple Example
269
+ class MyMapScreen < PM::MapScreen
270
+ title "My Map Screen"
271
+ tap_to_add length: 1.5
272
+ def annotations
273
+ []
274
+ end
275
+ end
276
+ ```
277
+
278
+ ```ruby
279
+ # A More Complex Example
280
+ class MyMapScreen < PM::MapScreen
281
+ title "My Map Screen"
282
+ tap_to_add length: 1.5, annotation: {animates_drop: true, title: "A Cool New Pin"}
283
+ def annotations
284
+ []
285
+ end
286
+
287
+ def will_appear
288
+ NSNotificationCenter.defaultCenter.addObserver(self, selector:"pin_adding:") , name:"ProMotionMapWillAddPin", object:nil)
289
+ NSNotificationCenter.defaultCenter.addObserver(self, selector:"pin_added:") , name:"ProMotionMapAddedPin", object:nil)
290
+ end
291
+
292
+ def will_disappear
293
+ NSNotificationCenter.defaultCenter.removeObserver(self)
294
+ end
295
+
296
+ def pin_adding(notification)
297
+ # We only want one pin on the map at a time
298
+ clear_annotations
299
+ end
300
+
301
+ def pin_added(notification)
302
+ # Once the pin is dropped we want to select it
303
+ select_annotation_at(0)
304
+ end
305
+ end
306
+ ```
307
+
219
308
  ---
220
309
 
221
310
  ### CocoaTouch Property Convenience Methods
@@ -7,11 +7,16 @@ module ProMotion
7
7
  @params = params
8
8
  set_defaults
9
9
 
10
- unless @params[:latitude] && @params[:longitude]
11
- PM.logger.error("You are required to specify :latitude and :longitude for annotations.")
12
- return nil
10
+ if @params[:coordinate]
11
+ @params[:latitude] = @params[:coordinate].latitude
12
+ @params[:longitude] = @params[:coordinate].longitude
13
+ @coordinate = @params[:coordinate]
14
+ elsif @params[:latitude] && @params[:longitude]
15
+ @coordinate = CLLocationCoordinate2D.new(@params[:latitude], @params[:longitude])
16
+ else
17
+ PM.logger.error("You are required to specify :latitude and :longitude or :coordinate for annotations.")
18
+ nil
13
19
  end
14
- @coordinate = CLLocationCoordinate2D.new(@params[:latitude], @params[:longitude])
15
20
  end
16
21
 
17
22
  def set_defaults
@@ -9,6 +9,7 @@ module ProMotion
9
9
  check_annotation_data
10
10
  @promotion_annotation_data = []
11
11
  set_up_start_position
12
+ set_up_tap_to_add
12
13
  end
13
14
 
14
15
  def view_will_appear(animated)
@@ -160,9 +161,11 @@ module ProMotion
160
161
  end
161
162
 
162
163
  def set_start_position(params={})
163
- params[:latitude] ||= 37.331789
164
- params[:longitude] ||= -122.029620
165
- params[:radius] ||= 10
164
+ params = {
165
+ latitude: 37.331789,
166
+ longitude: -122.029620,
167
+ radius: 10
168
+ }.merge(params)
166
169
 
167
170
  meters_per_mile = 1609.344
168
171
 
@@ -177,6 +180,42 @@ module ProMotion
177
180
  end
178
181
  end
179
182
 
183
+ def set_tap_to_add(params={})
184
+ params = {
185
+ length: 2.0,
186
+ target: self,
187
+ action: "gesture_drop_pin:",
188
+ annotation: {
189
+ title: "Dropped Pin",
190
+ animates_drop: true
191
+ }
192
+ }.merge(params)
193
+ @tap_to_add_annotation_params = params[:annotation]
194
+
195
+ lpgr = UILongPressGestureRecognizer.alloc.initWithTarget(params[:target], action:params[:action])
196
+ lpgr.minimumPressDuration = params[:length]
197
+ self.view.addGestureRecognizer(lpgr)
198
+ end
199
+
200
+ def gesture_drop_pin(gesture_recognizer)
201
+ if gesture_recognizer.state == UIGestureRecognizerStateBegan
202
+ NSNotificationCenter.defaultCenter.postNotificationName("ProMotionMapWillAddPin", object:nil)
203
+ touch_point = gesture_recognizer.locationInView(self.view)
204
+ touch_map_coordinate = self.view.convertPoint(touch_point, toCoordinateFromView:self.view)
205
+
206
+ add_annotation({
207
+ coordinate: touch_map_coordinate
208
+ }.merge(@tap_to_add_annotation_params))
209
+ NSNotificationCenter.defaultCenter.postNotificationName("ProMotionMapAddedPin", object:@promotion_annotation_data.last)
210
+ end
211
+ end
212
+
213
+ def set_up_tap_to_add
214
+ if self.class.respond_to?(:get_tap_to_add) && self.class.get_tap_to_add
215
+ self.set_tap_to_add self.class.get_tap_to_add_params
216
+ end
217
+ end
218
+
180
219
  # TODO: Why is this so complex?
181
220
  def zoom_to_fit_annotations(args={})
182
221
  # Preserve backwards compatibility
@@ -242,6 +281,18 @@ module ProMotion
242
281
  return geocoder.geocodeAddressString(args[:address].to_s, inRegion:args[:region].to_s, completionHandler: callback) if args[:region]
243
282
  end
244
283
 
284
+ def look_up_location(location, &callback)
285
+ location = CLLocation.alloc.initWithLatitude(location.latitude, longitude:location.longitude) if location.is_a?(CLLocationCoordinate2D)
286
+
287
+ if location.kind_of?(CLLocation)
288
+ geocoder = CLGeocoder.new
289
+ geocoder.reverseGeocodeLocation(location, completionHandler: callback)
290
+ else
291
+ PM.logger.info("You're trying to reverse geocode something that isn't a CLLocation")
292
+ callback.call nil, nil
293
+ end
294
+ end
295
+
245
296
  ########## Cocoa touch methods #################
246
297
  def mapView(map_view, viewForAnnotation:annotation)
247
298
  annotation_view(map_view, annotation)
@@ -276,6 +327,7 @@ module ProMotion
276
327
  end
277
328
 
278
329
  module MapClassMethods
330
+ # Start Position
279
331
  def start_position(params={})
280
332
  @start_position_params = params
281
333
  @start_position = true
@@ -288,6 +340,22 @@ module ProMotion
288
340
  def get_start_position
289
341
  @start_position ||= false
290
342
  end
343
+
344
+ # Tap to drop pin
345
+ def tap_to_add(params={})
346
+ @tap_to_add_params = params
347
+ @tap_to_add = true
348
+ end
349
+
350
+ def get_tap_to_add_params
351
+ @tap_to_add_params ||= nil
352
+ end
353
+
354
+ def get_tap_to_add
355
+ @tap_to_add ||= false
356
+ end
357
+
358
+
291
359
  end
292
360
  def self.included(base)
293
361
  base.extend(MapClassMethods)
@@ -301,6 +369,5 @@ module ProMotion
301
369
  @location_manager
302
370
  end
303
371
 
304
-
305
372
  end
306
373
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ProMotion-map
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rickert
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-11-18 00:00:00.000000000 Z
12
+ date: 2015-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ProMotion