ProMotion 2.4.2 → 2.5.0.beta1
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 +4 -4
- data/README.md +15 -13
- data/lib/ProMotion.rb +40 -14
- data/lib/ProMotion/cocoatouch/collection_view_cell.rb +8 -0
- data/lib/ProMotion/cocoatouch/collection_view_controller.rb +49 -0
- data/lib/ProMotion/cocoatouch/view_controller.rb +5 -0
- data/lib/ProMotion/collection/cell/collection_view_cell_module.rb +17 -0
- data/lib/ProMotion/collection/collection.rb +106 -0
- data/lib/ProMotion/collection/collection_builder.rb +39 -0
- data/lib/ProMotion/collection/collection_class_methods.rb +38 -0
- data/lib/ProMotion/collection/collection_screen.rb +8 -0
- data/lib/ProMotion/collection/data/collection_data.rb +32 -0
- data/lib/ProMotion/collection/data/collection_data_builder.rb +18 -0
- data/lib/ProMotion/delegate/delegate_module.rb +1 -1
- data/lib/ProMotion/ipad/split_screen.rb +0 -1
- data/lib/ProMotion/repl/live_reloader.rb +76 -0
- data/lib/ProMotion/repl/repl.rb +65 -0
- data/lib/ProMotion/screen/nav_bar_module.rb +8 -1
- data/lib/ProMotion/screen/screen_module.rb +26 -3
- data/lib/ProMotion/screen/screen_navigation.rb +3 -0
- data/lib/ProMotion/table/cell/table_view_cell_module.rb +11 -0
- data/lib/ProMotion/table/extensions/searchable.rb +11 -0
- data/lib/ProMotion/table/table.rb +12 -1
- data/lib/ProMotion/table/table_builder.rb +7 -5
- data/lib/ProMotion/tabs/tabs.rb +6 -3
- data/lib/ProMotion/version.rb +1 -1
- data/spec/functional/func_screen_spec.rb +25 -20
- data/spec/functional/func_split_screen_spec.rb +2 -2
- data/spec/unit/collection_screen_spec.rb +133 -0
- data/spec/unit/screen_helpers_spec.rb +1 -1
- data/spec/unit/screen_spec.rb +44 -6
- data/spec/unit/tables/table_module_spec.rb +28 -2
- data/spec/unit/tables/table_refreshable_spec.rb +25 -0
- data/spec/unit/tables/table_screen_spec.rb +0 -56
- data/spec/unit/tables/table_searchable_spec.rb +41 -0
- data/spec/unit/tables/table_view_cell_spec.rb +20 -1
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77d8dcbafac1e2b4972fc44dae533bf1c847b443
|
4
|
+
data.tar.gz: 8a7d5813a1c005b76a1354012205cd03f6845f86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb9181c62d284ba7e7a22ea3dd1902b284574f056e2e4c420961bf0d589b37dc2e2333d51c77de9bacb7d275e829de73c5804ff35423f83d78f30dbd72099c4c
|
7
|
+
data.tar.gz: bc025137788d5920b72e852c0b8a12545e4c49ef7fefde496ac66b293b4acc724df87e97ce3761b23002920f1a53ecf9f7560ff8cff66c1e2cf75c8beef937e4
|
data/README.md
CHANGED
@@ -3,9 +3,6 @@
|
|
3
3
|
[](https://rubygems.org/gems/ProMotion)
|
4
4
|
[](https://travis-ci.org/clearsightstudio/ProMotion)
|
5
5
|
[](https://codeclimate.com/github/clearsightstudio/ProMotion)
|
6
|
-
[](https://gemnasium.com/clearsightstudio/ProMotion)
|
7
|
-
[](https://www.omniref.com/ruby/gems/ProMotion)
|
8
|
-
[](https://waffle.io/clearsightstudio/ProMotion)
|
9
6
|
|
10
7
|
## iPhone Apps, Ruby-style
|
11
8
|
|
@@ -14,23 +11,20 @@ It introduces a clean, Ruby-style syntax for building screens that is easy to le
|
|
14
11
|
abstracts a ton of boilerplate UIViewController, UINavigationController, and other iOS code into a
|
15
12
|
simple, Ruby-like DSL.
|
16
13
|
|
17
|
-
* Watch Jamon Holmgren give a talk about ProMotion at [RubyMotion #inspect2014](http://confreaks.com/videos/3813-inspect-going-pro-with-promotion-from-prototype-to-production) (video)
|
18
|
-
* Watch the [September 2013 Motion Meetup](http://www.youtube.com/watch?v=rf7h-3AiMRQ) where Gant Laborde
|
19
|
-
interviews Jamon Holmgren about ProMotion
|
20
|
-
|
21
14
|
```ruby
|
22
15
|
# app/app_delegate.rb
|
23
16
|
class AppDelegate < PM::Delegate
|
24
17
|
status_bar true, animation: :fade
|
25
18
|
|
26
19
|
def on_load(app, options)
|
27
|
-
open RootScreen
|
20
|
+
open RootScreen
|
28
21
|
end
|
29
22
|
end
|
30
23
|
|
31
24
|
# app/screens/root_screen.rb
|
32
25
|
class RootScreen < PM::Screen
|
33
26
|
title "Root Screen"
|
27
|
+
nav_bar true
|
34
28
|
|
35
29
|
def on_load
|
36
30
|
set_nav_bar_button :right, title: "Help", action: :open_help_screen
|
@@ -69,16 +63,18 @@ end
|
|
69
63
|
|
70
64
|
|Screens|Navigation Bars|Tab Bars|
|
71
65
|
|---|---|---|
|
72
|
-
|[](http://promotion.readthedocs.org/en/master/Reference/
|
66
|
+
|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20Screen/)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20Screen/#set_nav_bar_buttonside-args)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20Tabs/)|
|
73
67
|
|
74
68
|
|Table Screens|Grouped Tables|Searchable|Refreshable|
|
75
69
|
|---|---|---|---|
|
76
|
-
|[](http://promotion.readthedocs.org/en/master/Reference/
|
70
|
+
|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20TableScreen/)|[](https://gist.github.com/jamonholmgren/382a6cf9963c5f0b2248)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20TableScreen/#searchableplaceholder-placeholder-text)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20TableScreen/#refreshableoptions)|
|
77
71
|
|
78
72
|
|
79
|
-
|
|
73
|
+
|SplitScreens|Map Screens|Web Screens|
|
80
74
|
|---|---|---|
|
81
|
-
|[](http://promotion.readthedocs.org/en/master/Reference/
|
75
|
+
|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20SplitScreen/)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20MapScreen/)|[](http://promotion.readthedocs.org/en/master/Reference/ProMotion%20WebScreen/)|
|
76
|
+
|
77
|
+
**NEW** [Live reloading!](http://promotion.readthedocs.org/en/master/Guides/Live Screen Reloading/) Use `pm_live_screens` to enable it, and `on_live_reload` in your screen to refresh things.
|
82
78
|
|
83
79
|
#### ...and much more.
|
84
80
|
|
@@ -123,7 +119,7 @@ This release includes several new features and is backwards compatible with all
|
|
123
119
|
|
124
120
|
## Your app
|
125
121
|
|
126
|
-
Open a pull request!
|
122
|
+
Open a pull request! We love adding new ProMotion-built apps.
|
127
123
|
|
128
124
|
# API Reference
|
129
125
|
|
@@ -131,6 +127,12 @@ We've created a comprehensive and always updated wiki with code examples, usage
|
|
131
127
|
|
132
128
|
### [ProMotion Documentation](https://github.com/clearsightstudio/ProMotion/blob/master/docs)
|
133
129
|
|
130
|
+
# Screencasts
|
131
|
+
|
132
|
+
* Watch Jamon Holmgren give a talk about ProMotion at [RubyMotion #inspect2014](http://confreaks.com/videos/3813-inspect-going-pro-with-promotion-from-prototype-to-production) (video)
|
133
|
+
* Watch the [September 2013 Motion Meetup](http://www.youtube.com/watch?v=rf7h-3AiMRQ) where Gant Laborde
|
134
|
+
interviews Jamon Holmgren about ProMotion
|
135
|
+
|
134
136
|
# Help
|
135
137
|
|
136
138
|
ProMotion is not only an easy DSL to get started. The community is very helpful and
|
data/lib/ProMotion.rb
CHANGED
@@ -12,33 +12,59 @@ Motion::Project::App.setup do |app|
|
|
12
12
|
app.files.insert(insert_point, file)
|
13
13
|
end
|
14
14
|
|
15
|
+
app.development do
|
16
|
+
app.info_plist["ProjectRootPath"] ||= File.absolute_path(app.project_dir)
|
17
|
+
end
|
18
|
+
|
15
19
|
# For compatibility with libraries that don't use detect_dependencies. :-(
|
16
20
|
app.files_dependencies({
|
17
21
|
"#{core_lib}/version.rb" => [ "#{core_lib}/pro_motion.rb" ],
|
18
22
|
"#{core_lib}/cocoatouch/table_view_cell.rb" => [ "#{core_lib}/table/cell/table_view_cell_module.rb" ],
|
19
23
|
"#{core_lib}/table/cell/table_view_cell_module.rb" => [ "#{core_lib}/styling/styling.rb" ],
|
24
|
+
"#{core_lib}/cocoatouch/collection_view_cell.rb" => [ "#{core_lib}/collection/cell/collection_view_cell_module.rb" ],
|
25
|
+
"#{core_lib}/collection/collection_screen.rb" => [
|
26
|
+
"#{core_lib}/screen/screen_module.rb",
|
27
|
+
"#{core_lib}/collection/cell/collection_view_cell_module.rb",
|
28
|
+
],
|
29
|
+
"#{core_lib}/collection/cell/collection_view_cell_module.rb" => [ "#{core_lib}/styling/styling.rb" ],
|
20
30
|
"#{core_lib}/delegate/delegate.rb" => [ "#{core_lib}/delegate/delegate_parent.rb" ],
|
21
31
|
"#{core_lib}/delegate/delegate_parent.rb" => [ "#{core_lib}/delegate/delegate_module.rb" ],
|
22
32
|
"#{core_lib}/delegate/delegate_module.rb" => [
|
23
|
-
|
24
|
-
|
25
|
-
|
33
|
+
"#{core_lib}/support/support.rb",
|
34
|
+
"#{core_lib}/tabs/tabs.rb",
|
35
|
+
"#{core_lib}/ipad/split_screen.rb"
|
26
36
|
],
|
27
37
|
"#{core_lib}/screen/screen.rb" => [ "#{core_lib}/screen/screen_module.rb" ],
|
28
|
-
"#{core_lib}/screen/
|
38
|
+
"#{core_lib}/screen/screen_navigation.rb" => [ "#{core_lib}/support/support.rb", ],
|
39
|
+
"#{core_lib}/screen/screen_module.rb" => [
|
40
|
+
"#{core_lib}/tabs/tabs.rb",
|
41
|
+
"#{core_lib}/screen/nav_bar_module.rb",
|
42
|
+
"#{core_lib}/screen/screen_navigation.rb",
|
43
|
+
"#{core_lib}/ipad/split_screen.rb",
|
44
|
+
],
|
29
45
|
"#{core_lib}/table/data/table_data.rb" => [
|
30
|
-
|
31
|
-
|
46
|
+
"#{core_lib}/table/data/table_data_builder.rb",
|
47
|
+
"#{core_lib}/table/table.rb"
|
48
|
+
],
|
49
|
+
"#{core_lib}/collection/data/collection_data.rb" => [
|
50
|
+
"#{core_lib}/collection/data/collection_data_builder.rb",
|
51
|
+
"#{core_lib}/collection/collection.rb",
|
52
|
+
"#{core_lib}/table/table_utils.rb"
|
32
53
|
],
|
33
54
|
"#{core_lib}/table/table.rb" => [
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
55
|
+
"#{core_lib}/table/table_class_methods.rb",
|
56
|
+
"#{core_lib}/table/table_builder.rb",
|
57
|
+
"#{core_lib}/table/table_utils.rb",
|
58
|
+
"#{core_lib}/table/extensions/searchable.rb",
|
59
|
+
"#{core_lib}/table/extensions/refreshable.rb",
|
60
|
+
"#{core_lib}/table/extensions/indexable.rb",
|
61
|
+
"#{core_lib}/table/extensions/longpressable.rb"
|
62
|
+
],
|
63
|
+
"#{core_lib}/collection/collection.rb" => [
|
64
|
+
"#{core_lib}/collection/collection_class_methods.rb",
|
65
|
+
"#{core_lib}/collection/collection_builder.rb",
|
66
|
+
"#{core_lib}/table/table_utils.rb"
|
41
67
|
],
|
42
68
|
"#{core_lib}/web/web_screen.rb" => [ "#{core_lib}/web/web_screen_module.rb" ],
|
43
|
-
|
69
|
+
})
|
44
70
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ProMotion
|
2
|
+
class CollectionViewController < UICollectionViewController
|
3
|
+
def self.new(args = {})
|
4
|
+
s = self.alloc.initWithCollectionViewLayout(get_collection_layout)
|
5
|
+
s.screen_init(args) if s.respond_to?(:screen_init)
|
6
|
+
s
|
7
|
+
end
|
8
|
+
|
9
|
+
def loadView
|
10
|
+
self.respond_to?(:load_view) ? self.load_view : super
|
11
|
+
end
|
12
|
+
|
13
|
+
def viewWillAppear(animated)
|
14
|
+
super
|
15
|
+
self.view_will_appear(animated) if self.respond_to?("view_will_appear:")
|
16
|
+
end
|
17
|
+
|
18
|
+
def viewDidAppear(animated)
|
19
|
+
super
|
20
|
+
self.view_did_appear(animated) if self.respond_to?("view_did_appear:")
|
21
|
+
end
|
22
|
+
|
23
|
+
def viewWillDisappear(animated)
|
24
|
+
self.view_will_disappear(animated) if self.respond_to?("view_will_disappear:")
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def viewDidDisappear(animated)
|
29
|
+
self.view_did_disappear(animated) if self.respond_to?("view_did_disappear:")
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def shouldAutorotateToInterfaceOrientation(orientation)
|
34
|
+
self.should_rotate(orientation)
|
35
|
+
end
|
36
|
+
|
37
|
+
def shouldAutorotate
|
38
|
+
self.should_autorotate
|
39
|
+
end
|
40
|
+
|
41
|
+
def willRotateToInterfaceOrientation(orientation, duration:duration)
|
42
|
+
self.will_rotate(orientation, duration)
|
43
|
+
end
|
44
|
+
|
45
|
+
def didRotateFromInterfaceOrientation(orientation)
|
46
|
+
self.on_rotate
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -35,6 +35,11 @@ module ProMotion
|
|
35
35
|
super
|
36
36
|
end
|
37
37
|
|
38
|
+
def didReceiveMemoryWarning
|
39
|
+
self.did_receive_memory_warning if self.respond_to?(:did_receive_memory_warning)
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
38
43
|
def shouldAutorotateToInterfaceOrientation(orientation)
|
39
44
|
self.should_rotate(orientation)
|
40
45
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ProMotion
|
2
|
+
module CollectionViewCellModule
|
3
|
+
include ProMotion::Styling
|
4
|
+
|
5
|
+
attr_accessor :data_cell, :collection_screen
|
6
|
+
|
7
|
+
def setup(data_cell, screen)
|
8
|
+
self.collection_screen = WeakRef.new(screen)
|
9
|
+
self.data_cell = data_cell
|
10
|
+
end
|
11
|
+
|
12
|
+
def prepareForReuse
|
13
|
+
super
|
14
|
+
self.send(:prepare_for_reuse) if self.respond_to?(:prepare_for_reuse)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module ProMotion
|
2
|
+
module Collection
|
3
|
+
include ProMotion::Styling
|
4
|
+
include ProMotion::Table::Utils
|
5
|
+
include ProMotion::CollectionBuilder
|
6
|
+
|
7
|
+
attr_reader :promotion_collection_data
|
8
|
+
|
9
|
+
def collection_view
|
10
|
+
self.collectionView
|
11
|
+
end
|
12
|
+
|
13
|
+
def screen_setup
|
14
|
+
check_collection_data
|
15
|
+
end
|
16
|
+
|
17
|
+
# Override viewDidLoad here to register cell classes here.
|
18
|
+
# Calling it from `screen_setup` cause `on_load` to be called twice
|
19
|
+
def viewDidLoad
|
20
|
+
super
|
21
|
+
set_up_register_class
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_up_register_class
|
25
|
+
collection_view.registerClass(PM::CollectionViewCell, forCellWithReuseIdentifier: PM::CollectionViewCell::KIdentifier)
|
26
|
+
if self.class.get_cell_classes
|
27
|
+
self.class.get_cell_classes.each do |identifier, klass|
|
28
|
+
collection_view.registerClass(klass, forCellWithReuseIdentifier: identifier.to_s)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_collection_data
|
34
|
+
mp("Missing #collection_data method in CollectionScreen #{self.class.to_s}.", force_color: :red) unless self.respond_to?(:collection_data)
|
35
|
+
end
|
36
|
+
|
37
|
+
def promotion_collection_data
|
38
|
+
@promotion_collection_data ||= CollectionData.new(collection_data, collection_view)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the data cell
|
42
|
+
def cell_at(args = {})
|
43
|
+
self.promotion_collection_data.cell(args)
|
44
|
+
end
|
45
|
+
|
46
|
+
def update_collection_view_data(data, args = {})
|
47
|
+
self.promotion_collection_data.data = data
|
48
|
+
if args[:index_paths]
|
49
|
+
collection_view.reloadItemsAtIndexPaths(Array(args[:index_paths]))
|
50
|
+
elsif args[:sections]
|
51
|
+
collection_view.reloadSections(args[:sections])
|
52
|
+
else
|
53
|
+
collection_view.reloadData
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def reload_data
|
58
|
+
update_collection_view_data(collection_data)
|
59
|
+
end
|
60
|
+
|
61
|
+
########## Cocoa touch methods #################
|
62
|
+
|
63
|
+
## UICollectionViewDataSource ##
|
64
|
+
def collectionView(_, numberOfItemsInSection: section)
|
65
|
+
self.promotion_collection_data.section_length(section)
|
66
|
+
end
|
67
|
+
|
68
|
+
def numberOfSectionsInCollectionView(_)
|
69
|
+
self.promotion_collection_data.sections.length
|
70
|
+
end
|
71
|
+
|
72
|
+
def collectionView(_, cellForItemAtIndexPath: index_path)
|
73
|
+
params = index_path_to_section_index(index_path: index_path)
|
74
|
+
data_cell = cell_at(index: params[:index], section: params[:section])
|
75
|
+
create_collection_cell(data_cell, index_path)
|
76
|
+
end
|
77
|
+
|
78
|
+
## UICollectionViewDelegate ##
|
79
|
+
def collectionView(view, didSelectItemAtIndexPath: index_path)
|
80
|
+
params = index_path_to_section_index(index_path: index_path)
|
81
|
+
data_cell = cell_at(index: params[:index], section: params[:section])
|
82
|
+
|
83
|
+
trigger_action(data_cell[:action], data_cell[:arguments], params) if data_cell[:action]
|
84
|
+
end
|
85
|
+
|
86
|
+
## UICollectionViewDelegateFlowLayout ##
|
87
|
+
def collectionView(_, layout: view_layout, sizeForItemAtIndexPath: index_path)
|
88
|
+
if self.respond_to?(:size_at_index_path)
|
89
|
+
self.size_at_index_path(index_path_to_section_index(index_path: index_path))
|
90
|
+
elsif view_layout.itemSize
|
91
|
+
view_layout.itemSize
|
92
|
+
elsif view_layout.respond_to?(:estimatedItemSize) and view_layout.estimatedItemSize
|
93
|
+
view_layout.estimatedItemSize
|
94
|
+
else
|
95
|
+
mp "Implement the size_at_index_path method in your PM::CollectionScreen or add item_size or estimated_item_size in the layout options to configure the size of your cells.", force_color: :yellow
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
protected
|
100
|
+
|
101
|
+
def self.included(base)
|
102
|
+
base.extend(CollectionClassMethods)
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ProMotion
|
2
|
+
module CollectionBuilder
|
3
|
+
def trigger_action(action, arguments, index_path)
|
4
|
+
action = (action.is_a?(Proc) ? action : method(action))
|
5
|
+
case arity = action.arity
|
6
|
+
when 0 then action.call # Just call the proc or the method
|
7
|
+
when 2 then action.call(arguments, index_path) # Send arguments and index path
|
8
|
+
else
|
9
|
+
mp("Action should not have optional parameters: #{action.to_s}", force_color: :yellow) if arity < 0
|
10
|
+
action.call(arguments) # Send arguments
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_collection_cell(data_cell, index_path)
|
15
|
+
cell = collection_view.dequeueReusableCellWithReuseIdentifier(data_cell[:cell_identifier].to_s, forIndexPath: index_path)
|
16
|
+
cell.extend(PM::CollectionViewCellModule) unless cell.is_a?(PM::CollectionViewCellModule)
|
17
|
+
cell.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin
|
18
|
+
cell.clipsToBounds = true
|
19
|
+
if cell.respond_to?(:reused)
|
20
|
+
if cell.reused
|
21
|
+
on_cell_reused(cell)
|
22
|
+
else
|
23
|
+
on_cell_created(cell)
|
24
|
+
cell.reused = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
cell.setup(data_cell, self) if cell.respond_to?(:setup)
|
28
|
+
cell
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_cell_created(cell)
|
32
|
+
cell.send(:on_created) if cell.respond_to?(:on_created)
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_cell_reused(cell)
|
36
|
+
cell.send(:on_reuse) if cell.respond_to?(:on_reuse)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module CollectionClassMethods
|
2
|
+
|
3
|
+
def collection_layout(klass, options={})
|
4
|
+
@layout = klass.new
|
5
|
+
@layout.scrollDirection = map_layout_direction(options.fetch(:direction, :vertical))
|
6
|
+
|
7
|
+
@layout.minimumLineSpacing = options[:minimum_line_spacing] if options.has_key?(:minimum_line_spacing)
|
8
|
+
@layout.minimumInteritemSpacing = options[:minimum_interitem_spacing] if options.has_key?(:minimum_interitem_spacing)
|
9
|
+
@layout.itemSize = options[:item_size] if options.has_key?(:item_size)
|
10
|
+
@layout.estimatedItemSize = options[:estimated_item_size] if options.has_key?(:estimated_item_size) and @layout.respond_to?(:estimatedItemSize)
|
11
|
+
@layout.sectionInset = options[:section_inset] if options.has_key?(:section_inset)
|
12
|
+
@layout
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_collection_layout
|
16
|
+
@layout ||= begin
|
17
|
+
layout = UICollectionViewFlowLayout.new
|
18
|
+
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal
|
19
|
+
|
20
|
+
layout
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def map_layout_direction(symbol)
|
25
|
+
{
|
26
|
+
horizontal: UICollectionViewScrollDirectionHorizontal,
|
27
|
+
vertical: UICollectionViewScrollDirectionVertical
|
28
|
+
}[symbol] || symbol || UICollectionViewScrollDirectionVertical
|
29
|
+
end
|
30
|
+
|
31
|
+
def cell_classes(options={})
|
32
|
+
@cell_classes = options
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_cell_classes
|
36
|
+
@cell_classes || nil
|
37
|
+
end
|
38
|
+
end
|