ProMotion 1.2.1 → 2.0.0.rc1

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -10
  3. data/lib/ProMotion.rb +11 -2
  4. data/lib/ProMotion/cocoatouch/ns_string.rb +5 -0
  5. data/lib/ProMotion/cocoatouch/ns_url.rb +5 -0
  6. data/lib/ProMotion/cocoatouch/tab_bar_controller.rb +5 -7
  7. data/lib/ProMotion/cocoatouch/table_view_cell.rb +0 -16
  8. data/lib/ProMotion/cocoatouch/table_view_controller.rb +2 -3
  9. data/lib/ProMotion/cocoatouch/view_controller.rb +3 -6
  10. data/lib/ProMotion/delegate/delegate.rb +0 -3
  11. data/lib/ProMotion/delegate/delegate_module.rb +24 -20
  12. data/lib/ProMotion/{containers → ipad}/split_screen.rb +30 -32
  13. data/lib/ProMotion/{logger.rb → logger/logger.rb} +6 -5
  14. data/lib/ProMotion/screen/nav_bar_module.rb +126 -0
  15. data/lib/ProMotion/screen/screen.rb +0 -3
  16. data/lib/ProMotion/screen/screen_module.rb +54 -177
  17. data/lib/ProMotion/screen/screen_navigation.rb +29 -40
  18. data/lib/ProMotion/{view → styling}/styling.rb +17 -47
  19. data/lib/ProMotion/table/cell/table_view_cell_module.rb +76 -123
  20. data/lib/ProMotion/table/data/table_data.rb +1 -1
  21. data/lib/ProMotion/table/extensions/longpressable.rb +24 -0
  22. data/lib/ProMotion/table/extensions/refreshable.rb +1 -0
  23. data/lib/ProMotion/table/grouped_table_screen.rb +0 -5
  24. data/lib/ProMotion/table/table.rb +63 -83
  25. data/lib/ProMotion/table/table_screen.rb +0 -4
  26. data/lib/ProMotion/{containers → tabs}/tabs.rb +20 -21
  27. data/lib/ProMotion/version.rb +1 -1
  28. data/lib/ProMotion/web/web_screen.rb +0 -4
  29. data/lib/ProMotion/web/web_screen_module.rb +8 -5
  30. data/spec/functional/func_screen_spec.rb +14 -18
  31. data/spec/functional/func_split_screen_spec.rb +2 -2
  32. data/spec/functional/func_table_screen_spec.rb +54 -40
  33. data/spec/functional/func_web_screen_spec.rb +12 -17
  34. data/spec/helpers/test_helper.rb +27 -0
  35. data/spec/unit/delegate_spec.rb +4 -67
  36. data/spec/unit/image_title_screen.rb +9 -0
  37. data/spec/unit/image_view_title_screen.rb +9 -0
  38. data/spec/unit/load_view_spec.rb +27 -0
  39. data/spec/unit/main_spec.rb +0 -6
  40. data/spec/unit/screen_helpers_spec.rb +23 -17
  41. data/spec/unit/screen_spec.rb +21 -17
  42. data/spec/unit/searchable_table_spec.rb +55 -0
  43. data/spec/unit/split_screen_in_tab_bar_spec.rb +5 -5
  44. data/spec/unit/split_screen_spec.rb +4 -4
  45. data/spec/unit/tab_bar_spec.rb +79 -0
  46. data/spec/unit/tab_spec.rb +11 -5
  47. data/spec/unit/tables/table_module_spec.rb +22 -8
  48. data/spec/unit/tables/table_screen_spec.rb +1 -1
  49. data/spec/unit/tables/table_view_cell_spec.rb +16 -16
  50. data/spec/unit/view_helper_spec.rb +6 -81
  51. data/spec/unit/view_title_screen.rb +10 -0
  52. data/spec/unit/web_spec.rb +31 -37
  53. metadata +37 -111
  54. data/.gitignore +0 -33
  55. data/.travis.yml +0 -4
  56. data/CONTRIBUTING.md +0 -20
  57. data/Gemfile +0 -5
  58. data/LICENSE +0 -22
  59. data/ProMotion.gemspec +0 -30
  60. data/Rakefile +0 -66
  61. data/app/app_delegate.rb +0 -7
  62. data/app/screens/basic_screen.rb +0 -15
  63. data/lib/ProMotion/delegate/delegate_notifications.rb +0 -70
  64. data/lib/ProMotion/extensions/conversions.rb +0 -20
  65. data/lib/ProMotion/map/map_screen.rb +0 -10
  66. data/lib/ProMotion/map/map_screen_annotation.rb +0 -65
  67. data/lib/ProMotion/map/map_screen_module.rb +0 -212
  68. data/lib/ProMotion/push_notification/push_notification.rb +0 -58
  69. data/resources/WebScreen.html +0 -6
  70. data/resources/list.png +0 -0
  71. data/resources/test.png +0 -0
  72. data/spec/functional/func_image_title_screen.rb +0 -20
  73. data/spec/functional/func_image_view_title_screen.rb +0 -20
  74. data/spec/functional/func_map_screen_spec.rb +0 -162
  75. data/spec/functional/func_searchable_table_spec.rb +0 -56
  76. data/spec/functional/func_tab_bar_spec.rb +0 -78
  77. data/spec/functional/func_view_title_screen.rb +0 -21
  78. data/spec/helpers/basic_screen.rb +0 -3
  79. data/spec/helpers/custom_title_view.rb +0 -4
  80. data/spec/helpers/detail_screen.rb +0 -3
  81. data/spec/helpers/dummy_class.rb +0 -3
  82. data/spec/helpers/functional_screen.rb +0 -15
  83. data/spec/helpers/home_screen.rb +0 -19
  84. data/spec/helpers/image_title_screen.rb +0 -15
  85. data/spec/helpers/image_view_title_screen.rb +0 -15
  86. data/spec/helpers/map_screen.rb +0 -53
  87. data/spec/helpers/master_screen.rb +0 -3
  88. data/spec/helpers/present_screen.rb +0 -26
  89. data/spec/helpers/screen_module_view_controller.rb +0 -55
  90. data/spec/helpers/tab_screen.rb +0 -4
  91. data/spec/helpers/table_screen.rb +0 -117
  92. data/spec/helpers/table_screen_indexable.rb +0 -18
  93. data/spec/helpers/table_screen_refreshable.rb +0 -11
  94. data/spec/helpers/table_screen_searchable.rb +0 -72
  95. data/spec/helpers/test_delegate.rb +0 -34
  96. data/spec/helpers/test_delegate_colors.rb +0 -17
  97. data/spec/helpers/view_title_screen.rb +0 -15
  98. data/spec/helpers/web_screen.rb +0 -23
  99. data/spec/unit/map_spec.rb +0 -71
data/.gitignore DELETED
@@ -1,33 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
-
19
- /build
20
- .repl_history
21
- .rvmrc
22
- .ruby-gemset
23
- .ruby-version
24
- .DS_Store
25
- .dat*
26
- .rake_tasks*
27
-
28
- # IDE / editor files
29
- .idea/
30
- *.tmproj
31
- *.tmproject
32
- tmtags
33
- *.sublime-workspace
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: objective-c
2
- gemfile:
3
- - Gemfile
4
- script: bundle exec rake spec
data/CONTRIBUTING.md DELETED
@@ -1,20 +0,0 @@
1
- Over 20 developers have contributed to ProMotion. We love it when ProMotion users become ProMotion contributors.
2
-
3
- ## Working on New Features
4
-
5
- 1. Clone the repo into `<My iOS Projects Folder>/ProMotion`
6
- 2. Update your `Gemfile`to reference the project as `gem 'ProMotion', :path => "../ProMotion"`
7
- 3. Run `bundle`
8
- 4. Run `rake clean` and then `rake`
9
- 5. Contribute!
10
-
11
- ## Submitting a Pull Request
12
-
13
- 1. Fork the project
14
- 2. Create a feature branch
15
- 3. Code
16
- 4. Update or create new specs ** NOTE: your PR is far more likely to be merged if you include comprehensive tests! **
17
- 5. Make sure tests are passing by running `rake spec` *(you can run functional and unit specs separately with `rake spec:func` and `rake spec:unit`, and a single spec with `rake spec:single f=test_file_name`)*
18
- 6. Submit pull request to `edge` (for new features) or `master` (for bugfixes)
19
- 7. Make a million little nitpicky changes that @jamonholmgren wants
20
- 8. Merged, then fame, adoration, kudos everywhere
data/Gemfile DELETED
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'motion-require'
4
- # Specify your gem's dependencies in ProMotion.gemspec
5
- gemspec
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 Jamon Holmgren
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/ProMotion.gemspec DELETED
@@ -1,30 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/ProMotion/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Jamon Holmgren", "Silas Matson", "Mark Rickert"]
6
- gem.email = ["jamon@clearsightstudio.com", "silas@clearsightstudio.com", "mark@mohawkapps.com"]
7
- gem.summary = "ProMotion makes it easy to build RubyMotion iOS screen-based apps."
8
- gem.description = "
9
- ProMotion is a RubyMotion gem that makes iOS development more like Ruby and less like Objective-C.
10
- It introduces a clean, Ruby-style syntax for building screens that is easy to learn and remember and
11
- abstracts a ton of boilerplate UIViewController, UINavigationController, and other iOS code into a
12
- simple, Ruby-like DSL.
13
- "
14
- gem.homepage = "https://github.com/clearsightstudio/ProMotion"
15
- gem.license = 'MIT'
16
-
17
- gem.files = `git ls-files`.split($\)
18
- gem.executables << "promotion"
19
- gem.test_files = gem.files.grep(%r{^(spec)/})
20
- gem.name = "ProMotion"
21
- gem.require_paths = ["lib"]
22
- gem.version = ProMotion::VERSION
23
-
24
- gem.add_dependency "motion-require", "~> 0.2"
25
- gem.add_runtime_dependency("methadone", "~> 1.3")
26
- gem.add_development_dependency("webstub", "~> 1.0")
27
- gem.add_development_dependency("motion-stump", "~> 0.3")
28
- gem.add_development_dependency("motion-redgreen", "~> 0.1")
29
- gem.add_development_dependency("rake", "~> 10.1")
30
- end
data/Rakefile DELETED
@@ -1,66 +0,0 @@
1
- $:.unshift("/Library/RubyMotion/lib")
2
- require 'motion/project/template/ios'
3
- require 'bundler'
4
- Bundler.require(:development)
5
- require 'ProMotion'
6
-
7
- Motion::Project::App.setup do |app|
8
- app.name = 'ProMotionTest'
9
- app.version = "0.99.0"
10
- app.redgreen_style = :full # :focused, :full
11
- app.frameworks += %w(CoreLocation MapKit)
12
-
13
- # Devices
14
- app.deployment_target = "6.0"
15
- app.device_family = [:ipad] # so we can test split screen capability
16
- end
17
-
18
- def all_files
19
- App.config.spec_files
20
- end
21
-
22
- def functional_files
23
- Dir.glob('./spec/functional/**/*.rb')
24
- end
25
-
26
- def unit_files
27
- Dir.glob('./spec/unit/**/*.rb')
28
- end
29
-
30
- namespace :spec do
31
- task :unit do
32
- App.config.spec_mode = true
33
- spec_files = all_files
34
- spec_files -= functional_files
35
- App.config.instance_variable_set("@spec_files", spec_files)
36
- Rake::Task["simulator"].invoke
37
- end
38
-
39
- task :func do
40
- Rake::Task["spec:functional"].invoke
41
- end
42
-
43
- task :functional do
44
- App.config.spec_mode = true
45
- spec_files = all_files
46
- spec_files -= unit_files
47
- App.config.instance_variable_set("@spec_files", spec_files)
48
- Rake::Task["simulator"].invoke
49
- end
50
-
51
- task :single do
52
- App.config.spec_mode = true
53
- spec_files = App.config.spec_files
54
- spec_files -= unit_files
55
- spec_files -= functional_files
56
- spec_files += Dir.glob("./spec/unit/**/#{ENV['f'] || ENV['file']}.rb")
57
- spec_files += Dir.glob("./spec/functional/**/#{ENV['f'] || ENV['file']}.rb")
58
- App.config.instance_variable_set("@spec_files", spec_files)
59
- Rake::Task["simulator"].invoke
60
- end
61
-
62
- end
63
-
64
- task :sim_close do
65
- sh "osascript -e 'tell application \"iphone simulator\" to quit'"
66
- end
data/app/app_delegate.rb DELETED
@@ -1,7 +0,0 @@
1
- class AppDelegate
2
-
3
- def on_load(app, options)
4
- open BasicScreen.new(nav_bar: true)
5
- end
6
-
7
- end
@@ -1,15 +0,0 @@
1
- class BasicScreen < PM::Screen
2
- title "Basic"
3
-
4
- attr_reader :animation_ts
5
-
6
- def will_appear
7
- @will_appear_ts = NSDate.date
8
- end
9
-
10
- def on_appear
11
- @on_appear_ts = NSDate.date
12
- @animation_ts = @on_appear_ts - @will_appear_ts
13
- end
14
-
15
- end
@@ -1,70 +0,0 @@
1
- module ProMotion
2
- module DelegateNotifications
3
-
4
- attr_accessor :aps_notification
5
-
6
- def check_for_push_notification(options)
7
- if options && options[UIApplicationLaunchOptionsRemoteNotificationKey]
8
- received_push_notification options[UIApplicationLaunchOptionsRemoteNotificationKey], true
9
- end
10
- end
11
-
12
- def register_for_push_notifications(*notification_types)
13
- notification_types = Array.new(notification_types)
14
- notification_types = [ :badge, :sound, :alert, :newsstand ] if notification_types.include?(:all)
15
-
16
- types = UIRemoteNotificationTypeNone
17
- notification_types.each { |t| types = types | map_notification_symbol(t) }
18
-
19
- UIApplication.sharedApplication.registerForRemoteNotificationTypes types
20
- end
21
-
22
- def unregister_for_push_notifications
23
- UIApplication.sharedApplication.unregisterForRemoteNotifications
24
- end
25
-
26
- def registered_push_notifications
27
- mask = UIApplication.sharedApplication.enabledRemoteNotificationTypes
28
- types = []
29
-
30
- types << :badge if mask & UIRemoteNotificationTypeBadge > 0
31
- types << :sound if mask & UIRemoteNotificationTypeSound > 0
32
- types << :alert if mask & UIRemoteNotificationTypeAlert > 0
33
- types << :newsstand if mask & UIRemoteNotificationTypeNewsstandContentAvailability > 0
34
-
35
- types
36
- end
37
-
38
- def received_push_notification(notification, was_launched)
39
- @aps_notification = PM::PushNotification.new(notification)
40
- on_push_notification(@aps_notification, was_launched) if respond_to?(:on_push_notification)
41
- end
42
-
43
- # CocoaTouch
44
-
45
- def application(application, didRegisterForRemoteNotificationsWithDeviceToken:device_token)
46
- on_push_registration(device_token, nil) if respond_to?(:on_push_registration)
47
- end
48
-
49
- def application(application, didFailToRegisterForRemoteNotificationsWithError:error)
50
- on_push_registration(nil, error) if respond_to?(:on_push_registration)
51
- end
52
-
53
- def application(application, didReceiveRemoteNotification:notification)
54
- received_push_notification(notification, application.applicationState != UIApplicationStateActive)
55
- end
56
-
57
- protected
58
-
59
- def map_notification_symbol(symbol)
60
- {
61
- none: UIRemoteNotificationTypeNone,
62
- badge: UIRemoteNotificationTypeBadge,
63
- sound: UIRemoteNotificationTypeSound,
64
- alert: UIRemoteNotificationTypeAlert,
65
- newsstand: UIRemoteNotificationTypeNewsstandContentAvailability
66
- }[symbol] || UIRemoteNotificationTypeNone
67
- end
68
-
69
- end
70
- end
@@ -1,20 +0,0 @@
1
- module ProMotion
2
- module Conversions
3
-
4
- # For converting, for example, from :contacts to UITabBarSystemItemContacts
5
- # Unfortunately, this only works if the symbol is defined in your code.
6
- # So, for now, we'll have to do it manually.
7
- def convert_symbol(symbol, prefix)
8
- Object.const_get("#{prefix}#{camel_case symbol}")
9
- end
10
-
11
- def objective_c_method_name(str)
12
- str.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
13
- end
14
-
15
- def camel_case(str)
16
- str.split('_').map(&:capitalize).join
17
- end
18
-
19
- end
20
- end
@@ -1,10 +0,0 @@
1
- motion_require '../cocoatouch/view_controller'
2
- motion_require '../screen/screen_module'
3
- motion_require 'map_screen_module'
4
-
5
- module ProMotion
6
- class MapScreen < ViewController
7
- include ProMotion::ScreenModule
8
- include ProMotion::MapScreenModule
9
- end
10
- end
@@ -1,65 +0,0 @@
1
- module ProMotion
2
- class MapScreenAnnotation
3
-
4
- #Creates the new crime object
5
- def initialize(params = {})
6
- @params = params
7
- set_defaults
8
-
9
- unless @params[:latitude] && @params[:longitude]
10
- PM.logger.error("You are required to specify :latitude and :longitude for annotations.")
11
- return nil
12
- end
13
- @coordinate = CLLocationCoordinate2D.new(@params[:latitude], @params[:longitude])
14
- end
15
-
16
- def set_defaults
17
- @params = {
18
- title: "Title",
19
- pin_color: MKPinAnnotationColorRed,
20
- identifier: "Annotation-#{@params[:pin_color] || @params[:image]}",
21
- show_callout: true,
22
- animates_drop: false
23
- }.merge(@params)
24
- end
25
-
26
- def title
27
- @params[:title]
28
- end
29
-
30
- def subtitle
31
- @params[:subtitle] ||= nil
32
- end
33
-
34
- def coordinate
35
- @coordinate
36
- end
37
-
38
- def cllocation
39
- CLLocation.alloc.initWithLatitude(@params[:latitude], longitude:@params[:longitude])
40
- end
41
-
42
- def setCoordinate(new_coordinate);
43
- if new_coordinate.is_a? Hash
44
- @coordinate = CLLocationCoordinate2D.new(new_coordinate[:latitude], new_coordinate[:longitude])
45
- else
46
- @coordinate = new_coordinate
47
- end
48
- end
49
-
50
- # Allows for retrieving your own custom values on the annotation
51
- def annotation_params
52
- @params
53
- end
54
-
55
- def method_missing(meth, *args)
56
- if @params[meth.to_sym]
57
- @params[meth.to_sym]
58
- else
59
- PM.logger.warn "The annotation parameter \"#{meth}\" does not exist on this pin."
60
- nil
61
- end
62
- end
63
-
64
- end
65
- end
@@ -1,212 +0,0 @@
1
- module ProMotion
2
- module MapScreenModule
3
- attr_accessor :mapview
4
-
5
- def screen_setup
6
- check_mapkit_included
7
- self.mapview ||= add MKMapView.new, {
8
- frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height),
9
- resize: [ :width, :height ],
10
- delegate: self
11
- }
12
-
13
- check_annotation_data
14
- @promotion_annotation_data = []
15
- set_up_start_position
16
- end
17
-
18
- def view_will_appear(animated)
19
- super
20
- update_annotation_data
21
- end
22
-
23
- def check_mapkit_included
24
- PM.logger.error "You must add MapKit and CoreLocation to your project's frameworks in the Rakefile." unless defined?(CLLocationCoordinate2D)
25
- end
26
-
27
- def check_annotation_data
28
- PM.logger.error "Missing #annotation_data method in MapScreen #{self.class.to_s}." unless self.respond_to?(:annotation_data)
29
- end
30
-
31
- def update_annotation_data
32
- clear_annotations
33
- add_annotations annotation_data
34
- end
35
-
36
- def map
37
- self.mapview
38
- end
39
-
40
- def center
41
- self.mapview.centerCoordinate
42
- end
43
-
44
- def center=(params={})
45
- PM.logger.error "Missing #:latitude property in call to #center=." unless params[:latitude]
46
- PM.logger.error "Missing #:longitude property in call to #center=." unless params[:longitude]
47
- params[:animated] = true
48
-
49
- # Set the new region
50
- self.mapview.setCenterCoordinate(
51
- CLLocationCoordinate2D.new(params[:latitude], params[:longitude]),
52
- animated:params[:animated]
53
- )
54
- end
55
-
56
- def annotations
57
- @promotion_annotation_data
58
- end
59
-
60
- def select_annotation(annotation, animated=true)
61
- self.mapview.selectAnnotation(annotation, animated:animated)
62
- end
63
-
64
- def select_annotation_at(annotation_index, animated=true)
65
- select_annotation(annotations[annotation_index], animated:animated)
66
- end
67
-
68
- def selected_annotations
69
- self.mapview.selectedAnnotations
70
- end
71
-
72
- def deselect_annotations(animated=false)
73
- unless selected_annotations.nil?
74
- selected_annotations.each do |annotation|
75
- self.mapview.deselectAnnotation(annotation, animated:animated)
76
- end
77
- end
78
- end
79
-
80
- def add_annotation(annotation)
81
- @promotion_annotation_data << MapScreenAnnotation.new(annotation)
82
- self.mapview.addAnnotation @promotion_annotation_data.last
83
- end
84
-
85
- def add_annotations(annotations)
86
- @promotion_annotation_data = Array(annotations).map{|a| MapScreenAnnotation.new(a)}
87
- self.mapview.addAnnotations @promotion_annotation_data
88
- end
89
-
90
- def clear_annotations
91
- @promotion_annotation_data.each do |a|
92
- self.mapview.removeAnnotation(a)
93
- end
94
- @promotion_annotation_data = []
95
- end
96
-
97
- def mapView(mapView, viewForAnnotation:annotation)
98
- identifier = annotation.annotation_params[:identifier]
99
- if view = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier)
100
- view.annotation = annotation
101
- else
102
- #Set the pin properties
103
- if annotation.annotation_params[:image]
104
- view = MKAnnotationView.alloc.initWithAnnotation(annotation, reuseIdentifier:identifier)
105
- view.image = annotation.annotation_params[:image]
106
- else
107
- view = MKPinAnnotationView.alloc.initWithAnnotation(annotation, reuseIdentifier:identifier)
108
- view.animatesDrop = annotation.annotation_params[:animates_drop]
109
- view.pinColor = annotation.annotation_params[:pin_color]
110
- end
111
- view.canShowCallout = annotation.annotation_params[:show_callout]
112
- end
113
- view
114
- end
115
-
116
- def set_start_position(params={})
117
- params[:latitude] ||= 37.331789
118
- params[:longitude] ||= -122.029620
119
- params[:radius] ||= 10
120
-
121
- meters_per_mile = 1609.344
122
-
123
- initialLocation = CLLocationCoordinate2D.new(params[:latitude], params[:longitude])
124
- region = MKCoordinateRegionMakeWithDistance(initialLocation, params[:radius] * meters_per_mile, params[:radius] * meters_per_mile)
125
- self.mapview.setRegion(region, animated:false)
126
- end
127
-
128
- def set_up_start_position
129
- if self.class.respond_to?(:get_start_position) && self.class.get_start_position
130
- self.set_start_position self.class.get_start_position_params
131
- end
132
- end
133
-
134
- # TODO: Why is this so complex?
135
- def zoom_to_fit_annotations(animated=true)
136
- #Don't attempt the rezoom of there are no pins
137
- return if annotations.count == 0
138
-
139
- #Set some crazy boundaries
140
- topLeft = CLLocationCoordinate2D.new(-90, 180)
141
- bottomRight = CLLocationCoordinate2D.new(90, -180)
142
-
143
- #Find the bounds of the pins
144
- annotations.each do |a|
145
- topLeft.longitude = [topLeft.longitude, a.coordinate.longitude].min
146
- topLeft.latitude = [topLeft.latitude, a.coordinate.latitude].max
147
- bottomRight.longitude = [bottomRight.longitude, a.coordinate.longitude].max
148
- bottomRight.latitude = [bottomRight.latitude, a.coordinate.latitude].min
149
- end
150
-
151
- #Find the bounds of all the pins and set the mapView
152
- coord = CLLocationCoordinate2D.new(
153
- topLeft.latitude - (topLeft.latitude - bottomRight.latitude) * 0.5,
154
- topLeft.longitude + (bottomRight.longitude - topLeft.longitude) * 0.5
155
- )
156
-
157
- # Add some padding to the edges
158
- span = MKCoordinateSpanMake(
159
- ((topLeft.latitude - bottomRight.latitude) * 1.075).abs,
160
- ((bottomRight.longitude - topLeft.longitude) * 1.075).abs
161
- )
162
-
163
- region = MKCoordinateRegionMake(coord, span)
164
- fits = self.mapview.regionThatFits(region);
165
-
166
- self.mapview.setRegion(fits, animated:animated)
167
- end
168
-
169
- def set_region(region, animated=true)
170
- self.mapview.setRegion(region, animated:animated)
171
- end
172
-
173
- def region(params)
174
- return nil unless params.is_a? Hash
175
-
176
- params[:coordinate] = CLLocationCoordinate2D.new(params[:coordinate][:latitude], params[:coordinate][:longitude]) if params[:coordinate].is_a? Hash
177
- params[:span] = MKCoordinateSpanMake(params[:span][0], params[:span][1]) if params[:span].is_a? Array
178
-
179
- if params[:coordinate] && params[:span]
180
- MKCoordinateRegionMake( params[:coordinate], params[:span] )
181
- end
182
- end
183
-
184
- def look_up_address(args={}, &callback)
185
- args[:address] = args if args.is_a? String # Assume if a string is passed that they want an address
186
-
187
- geocoder = CLGeocoder.new
188
- return geocoder.geocodeAddressDictionary(args[:address], completionHandler: callback) if args[:address].is_a?(Hash)
189
- return geocoder.geocodeAddressString(args[:address].to_s, completionHandler: callback) unless args[:region]
190
- return geocoder.geocodeAddressString(args[:address].to_s, inRegion:args[:region].to_s, completionHandler: callback) if args[:region]
191
- end
192
-
193
- module MapClassMethods
194
- def start_position(params={})
195
- @start_position_params = params
196
- @start_position = true
197
- end
198
-
199
- def get_start_position_params
200
- @start_position_params ||= nil
201
- end
202
-
203
- def get_start_position
204
- @start_position ||= false
205
- end
206
- end
207
- def self.included(base)
208
- base.extend(MapClassMethods)
209
- end
210
-
211
- end
212
- end