ProMotion 1.2.1 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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