ProMotion 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -2
- data/README.md +40 -11
- data/app/app_delegate.rb +1 -1
- data/lib/ProMotion/AppDelegate.rb +2 -2
- data/lib/ProMotion/_ext/NavigationController.rb +3 -1
- data/lib/ProMotion/_ext/TableViewCell.rb +16 -0
- data/lib/ProMotion/_ext/TableViewController.rb +33 -0
- data/lib/ProMotion/_ext/ViewController.rb +50 -3
- data/lib/ProMotion/_modules/ScreenNavigation.rb +13 -6
- data/lib/ProMotion/classes/Screen.rb +84 -5
- data/lib/ProMotion/helpers/MeasureHelper.rb +0 -1
- data/lib/ProMotion/helpers/TabBar.rb +0 -28
- data/lib/ProMotion/helpers/motion-table/1st/sectioned_table.rb +99 -15
- data/lib/ProMotion/helpers/system_helper.rb +29 -0
- data/lib/ProMotion/version.rb +1 -1
- metadata +4 -2
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
# ProMotion - A new way to
|
1
|
+
# ProMotion - A new way to easily build RubyMotion apps.
|
2
2
|
|
3
3
|
ProMotion introduces a new object called "Screens". Screens have a one-to-one relationship
|
4
|
-
with your app's screens
|
4
|
+
with your app's designed screens.
|
5
|
+
|
6
|
+
Check out the tutorial here: http://www.clearsightstudio.com/insights/ruby-motion-promotion-tutorial
|
7
|
+
|
8
|
+
Sample app here: https://github.com/jamonholmgren/promotion-tutorial
|
5
9
|
|
6
10
|
Typical app file structure:
|
7
11
|
|
@@ -14,7 +18,6 @@ Typical app file structure:
|
|
14
18
|
home_screen.rb
|
15
19
|
settings_screen.rb
|
16
20
|
models/
|
17
|
-
view_controllers/
|
18
21
|
views/
|
19
22
|
app_delegate.rb
|
20
23
|
|
@@ -25,7 +28,7 @@ Loading your home screen:
|
|
25
28
|
```ruby
|
26
29
|
# In /app/app_delegate.rb (note that AppDelegate extends ProMotion::AppDelegateParent)
|
27
30
|
class AppDelegate < ProMotion::AppDelegateParent
|
28
|
-
def on_load(options)
|
31
|
+
def on_load(app, options)
|
29
32
|
open_screen MyHomeScreen.new(nav_bar: true)
|
30
33
|
end
|
31
34
|
end
|
@@ -51,14 +54,28 @@ class HomeScreen < ProMotion::Screen
|
|
51
54
|
end
|
52
55
|
```
|
53
56
|
|
54
|
-
Creating a tabbed bar
|
57
|
+
Creating a tabbed bar from a screen (this has to be done inside a screen -- it won't work
|
58
|
+
in your app_delegate.rb). This will set the tab bar as the root view controller for your app,
|
59
|
+
so keep that in mind.
|
60
|
+
|
61
|
+
NOTE: It needs to be done in the on_appear or afterward, not the `on_load` or
|
62
|
+
`will_appear`. We will likely fix this in the future, but for now that's a restriction.
|
55
63
|
|
56
64
|
```ruby
|
57
|
-
def
|
58
|
-
@home
|
59
|
-
@settings
|
60
|
-
@contact
|
61
|
-
open_tab_bar @home, @settings, @contact
|
65
|
+
def on_appear
|
66
|
+
@home ||= MyHomeScreen.new(nav_bar: true)
|
67
|
+
@settings ||= SettingsScreen.new
|
68
|
+
@contact ||= ContactScreen.new(nav_bar: true)
|
69
|
+
@tab_bar ||= open_tab_bar @home, @settings, @contact
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
For each screen that belongs to the tab bar, you need to set the tab name and icon in the files.
|
74
|
+
In this example, we would need add the following to the three files (my_home_screen.rb, settings_screen.rb, contact_screen.rb):
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
def on_opened
|
78
|
+
set_tab_bar_item title: "Tab Name Goes Here", icon: "tab_icon.png" # in resources folder
|
62
79
|
end
|
63
80
|
```
|
64
81
|
|
@@ -169,7 +186,7 @@ it to the current view. Screens include this helper by default.
|
|
169
186
|
|
170
187
|
You can create sectioned table screens easily. TableScreen, SectionedTableScreen, GroupedTableScreen.
|
171
188
|
This is loosely based on [motion-table](https://github.com/clearsightstudio/motion-table) (there are a
|
172
|
-
few minor differences).
|
189
|
+
few minor differences). We will eventually combine the two.
|
173
190
|
|
174
191
|
```ruby
|
175
192
|
class SettingsScreen < ProMotion::GroupedTableScreen
|
@@ -211,6 +228,18 @@ class SettingsScreen < ProMotion::GroupedTableScreen
|
|
211
228
|
end
|
212
229
|
```
|
213
230
|
|
231
|
+
You can provide remotely downloaded images for cells by including the CocoaPod "SDWebImage" in
|
232
|
+
your Rakefile and doing this:
|
233
|
+
|
234
|
+
```ruby
|
235
|
+
cells: [
|
236
|
+
{
|
237
|
+
title: "Cell with image",
|
238
|
+
remoteImage: { url: "http://placekitten.com/200/300", placeholder: "some-local-image" }
|
239
|
+
}
|
240
|
+
]
|
241
|
+
```
|
242
|
+
|
214
243
|
# Reference
|
215
244
|
(not comprehensive yet...working on this)
|
216
245
|
|
data/app/app_delegate.rb
CHANGED
@@ -6,8 +6,8 @@ module ProMotion
|
|
6
6
|
return true if RUBYMOTION_ENV == "test"
|
7
7
|
|
8
8
|
Console.log(" Your AppDelegate (usually in app_delegate.rb) needs an on_load(options) method.", withColor: Console::RED_COLOR) unless self.respond_to?(:on_load)
|
9
|
-
|
10
|
-
on_load launchOptions
|
9
|
+
|
10
|
+
on_load(application, launchOptions)
|
11
11
|
|
12
12
|
open_home_screen if has_home_screen
|
13
13
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ProMotion
|
2
|
+
class TableViewCell < UITableViewCell
|
3
|
+
attr_accessor :image_size
|
4
|
+
|
5
|
+
def layoutSubviews
|
6
|
+
super
|
7
|
+
|
8
|
+
if self.image_size && self.imageView.image && self.imageView.image.size && self.imageView.image.size.width > 0
|
9
|
+
f = self.imageView.frame
|
10
|
+
size_inset_x = (self.imageView.size.width - self.image_size) / 2
|
11
|
+
size_inset_y = (self.imageView.size.height - self.image_size) / 2
|
12
|
+
self.imageView.frame = CGRectInset(f, size_inset_x, size_inset_y)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -16,6 +16,39 @@ module ProMotion
|
|
16
16
|
super
|
17
17
|
self.screen.view_did_appear(animated) if self.screen && self.screen.respond_to?(:view_did_appear)
|
18
18
|
end
|
19
|
+
|
20
|
+
def viewWillDisappear(animated)
|
21
|
+
if self.screen && self.screen.respond_to?(:view_will_disappear)
|
22
|
+
self.screen.view_will_disappear(animated)
|
23
|
+
end
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def viewDidDisappear(animated)
|
28
|
+
if self.screen && self.screen.respond_to?(:view_did_disappear)
|
29
|
+
self.screen.view_did_disappear(animated)
|
30
|
+
end
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def shouldAutorotateToInterfaceOrientation(orientation)
|
35
|
+
self.screen.should_rotate(orientation)
|
36
|
+
end
|
37
|
+
|
38
|
+
def shouldAutorotate
|
39
|
+
self.screen.should_autorotate
|
40
|
+
end
|
41
|
+
|
42
|
+
def willRotateToInterfaceOrientation(orientation, duration:duration)
|
43
|
+
self.screen.will_rotate(orientation, duration)
|
44
|
+
end
|
45
|
+
|
46
|
+
def didRotateFromInterfaceOrientation(orientation)
|
47
|
+
self.screen.on_rotate
|
48
|
+
end
|
19
49
|
|
50
|
+
def dealloc
|
51
|
+
$stderr.puts "Deallocating #{self.to_s}" if ProMotion::Screen.debug_mode
|
52
|
+
end
|
20
53
|
end
|
21
54
|
end
|
@@ -4,18 +4,65 @@ module ProMotion
|
|
4
4
|
|
5
5
|
def viewDidLoad
|
6
6
|
super
|
7
|
-
|
7
|
+
if screen_will_respond_to?(:view_did_load)
|
8
|
+
self.screen.view_did_load
|
9
|
+
end
|
8
10
|
end
|
9
11
|
|
10
12
|
def viewWillAppear(animated)
|
11
13
|
super
|
12
|
-
|
14
|
+
if screen_will_respond_to?(:view_will_appear)
|
15
|
+
self.screen.view_will_appear(animated)
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
15
19
|
def viewDidAppear(animated)
|
16
20
|
super
|
17
|
-
|
21
|
+
if screen_will_respond_to?(:view_did_appear)
|
22
|
+
self.screen.view_did_appear(animated)
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
26
|
+
def viewWillDisappear(animated)
|
27
|
+
if screen_will_respond_to?(:view_will_disappear)
|
28
|
+
self.screen.view_will_disappear(animated)
|
29
|
+
end
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def viewDidDisappear(animated)
|
34
|
+
if screen_will_respond_to?(:view_did_disappear)
|
35
|
+
self.screen.view_did_disappear(animated)
|
36
|
+
end
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def screen_will_respond_to?(method)
|
41
|
+
self.screen && self.screen.respond_to?(method)
|
42
|
+
end
|
43
|
+
|
44
|
+
def shouldAutorotateToInterfaceOrientation(orientation)
|
45
|
+
self.screen.should_rotate(orientation)
|
46
|
+
end
|
47
|
+
|
48
|
+
def shouldAutorotate
|
49
|
+
self.screen.should_autorotate
|
50
|
+
end
|
51
|
+
|
52
|
+
def supportedInterfaceOrientations
|
53
|
+
self.screen.supported_orientations
|
54
|
+
end
|
55
|
+
|
56
|
+
def willRotateToInterfaceOrientation(orientation, duration:duration)
|
57
|
+
self.screen.will_rotate(orientation, duration)
|
58
|
+
end
|
59
|
+
|
60
|
+
def didRotateFromInterfaceOrientation(orientation)
|
61
|
+
self.screen.on_rotate
|
62
|
+
end
|
63
|
+
|
64
|
+
def dealloc
|
65
|
+
$stderr.puts "Deallocating #{self.to_s}" if ProMotion::Screen.debug_mode
|
66
|
+
end
|
20
67
|
end
|
21
68
|
end
|
@@ -24,14 +24,16 @@ module ProMotion
|
|
24
24
|
self.view_controller.presentModalViewController(screen.main_controller, animated:true)
|
25
25
|
elsif args[:in_tab] && self.tab_bar
|
26
26
|
vc = open_tab(args[:in_tab])
|
27
|
-
$stderr.puts "Found a #{vc.to_s}"
|
27
|
+
# $stderr.puts "Found a #{vc.to_s}"
|
28
28
|
if vc
|
29
|
-
if vc.is_a?
|
29
|
+
if vc.is_a?(UINavigationController)
|
30
|
+
screen.navigation_controller = vc
|
30
31
|
push_view_controller(screen.view_controller, vc)
|
31
32
|
else
|
32
33
|
self.tab_bar.selectedIndex = vc.tabBarItem.tag
|
33
34
|
$stderr.puts "#{self.tab_bar.selectedIndex} is selected and should be #{vc.tabBarItem.tag}"
|
34
35
|
# PM::TabBar.replace_current_item(self.tab_bar, view_controller: screen.view_controller)
|
36
|
+
# TODO: This doesn't work yet.
|
35
37
|
end
|
36
38
|
else
|
37
39
|
$stderr.puts "No tab bar item '#{args[:in_tab]}'"
|
@@ -41,7 +43,7 @@ module ProMotion
|
|
41
43
|
else
|
42
44
|
open_view_controller screen.main_controller
|
43
45
|
end
|
44
|
-
|
46
|
+
|
45
47
|
if screen.respond_to?(:on_opened)
|
46
48
|
screen.send(:on_opened)
|
47
49
|
end
|
@@ -72,8 +74,14 @@ module ProMotion
|
|
72
74
|
else
|
73
75
|
Console.log("Tried to close #{self.to_s}; however, this screen isn't modal or in a nav bar.", withColor: Console::PURPLE_COLOR)
|
74
76
|
end
|
75
|
-
|
76
|
-
|
77
|
+
|
78
|
+
if previous_screen && previous_screen.respond_to?(:on_return)
|
79
|
+
if args
|
80
|
+
previous_screen.send(:on_return, args)
|
81
|
+
else
|
82
|
+
previous_screen.send(:on_return)
|
83
|
+
end
|
84
|
+
end
|
77
85
|
end
|
78
86
|
|
79
87
|
def tab_bar_controller(*screens)
|
@@ -121,7 +129,6 @@ module ProMotion
|
|
121
129
|
|
122
130
|
def open_tab(tab)
|
123
131
|
if tab.is_a? String
|
124
|
-
$stderr.puts "Opening tab in #{self.tab_bar.to_s} : #{tab}"
|
125
132
|
return PM::TabBar.select(self.tab_bar, title: tab)
|
126
133
|
else
|
127
134
|
$stderr.puts "Unable to open tab #{tab.to_s} because it isn't a string."
|
@@ -3,12 +3,13 @@ module ProMotion
|
|
3
3
|
class Screen
|
4
4
|
include ProMotion::ScreenNavigation
|
5
5
|
include ProMotion::ScreenElements
|
6
|
+
include ProMotion::SystemHelper
|
6
7
|
|
7
8
|
attr_accessor :view_controller, :navigation_controller, :parent_screen, :first_screen, :tab_bar_item, :tab_bar, :modal
|
8
9
|
|
9
10
|
def initialize(args = {})
|
10
11
|
args.each do |k, v|
|
11
|
-
self.send
|
12
|
+
self.send("#{k}=", v) if self.respond_to?("#{k}=")
|
12
13
|
end
|
13
14
|
self.load_view_controller
|
14
15
|
self.view_controller.title = self.title
|
@@ -86,21 +87,38 @@ module ProMotion
|
|
86
87
|
self.view_controller = vc
|
87
88
|
end
|
88
89
|
|
90
|
+
def view_did_load; end
|
91
|
+
def on_opened; end
|
92
|
+
|
89
93
|
def view_will_appear(animated)
|
90
|
-
|
94
|
+
ProMotion::Screen.current_screen = self
|
95
|
+
self.will_appear
|
91
96
|
end
|
97
|
+
def will_appear; end
|
92
98
|
|
93
99
|
def view_did_appear(animated)
|
94
|
-
|
100
|
+
ProMotion::Screen.current_screen = self
|
101
|
+
self.on_appear
|
102
|
+
end
|
103
|
+
def on_appear; end
|
104
|
+
|
105
|
+
def view_will_disappear(animated)
|
106
|
+
self.will_disappear
|
95
107
|
end
|
108
|
+
def will_disappear; end
|
109
|
+
|
110
|
+
def view_did_disappear(animated)
|
111
|
+
self.on_disappear
|
112
|
+
end
|
113
|
+
def on_disappear; end
|
96
114
|
|
97
115
|
def title
|
98
|
-
self.class.send
|
116
|
+
self.class.send(:get_title)
|
99
117
|
end
|
100
118
|
|
101
119
|
def title=(new_title)
|
102
120
|
self.class.title = new_title
|
103
|
-
self.view_controller.title = new_title
|
121
|
+
self.view_controller.title = new_title if self.view_controller
|
104
122
|
end
|
105
123
|
|
106
124
|
def main_controller
|
@@ -108,11 +126,72 @@ module ProMotion
|
|
108
126
|
self.view_controller
|
109
127
|
end
|
110
128
|
|
129
|
+
def should_rotate(orientation)
|
130
|
+
case orientation
|
131
|
+
when UIInterfaceOrientationPortrait
|
132
|
+
return supported_orientation?("UIInterfaceOrientationPortrait")
|
133
|
+
when UIInterfaceOrientationLandscapeLeft
|
134
|
+
return supported_orientation?("UIInterfaceOrientationLandscapeLeft")
|
135
|
+
when UIInterfaceOrientationLandscapeRight
|
136
|
+
return supported_orientation?("UIInterfaceOrientationLandscapeRight")
|
137
|
+
when UIInterfaceOrientationPortraitUpsideDown
|
138
|
+
return supported_orientation?("UIInterfaceOrientationPortraitUpsideDown")
|
139
|
+
else
|
140
|
+
false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def will_rotate(orientation, duration)
|
145
|
+
end
|
146
|
+
|
147
|
+
def should_autorotate
|
148
|
+
false
|
149
|
+
end
|
150
|
+
|
151
|
+
def on_rotate
|
152
|
+
end
|
153
|
+
|
154
|
+
def supported_orientation?(orientation)
|
155
|
+
NSBundle.mainBundle.infoDictionary["UISupportedInterfaceOrientations"].include?(orientation)
|
156
|
+
end
|
157
|
+
|
158
|
+
def supported_orientations
|
159
|
+
ors = 0
|
160
|
+
NSBundle.mainBundle.infoDictionary["UISupportedInterfaceOrientations"].each do |ori|
|
161
|
+
case ori
|
162
|
+
when "UIInterfaceOrientationPortrait"
|
163
|
+
ors |= UIInterfaceOrientationMaskPortrait
|
164
|
+
when "UIInterfaceOrientationLandscapeLeft"
|
165
|
+
ors |= UIInterfaceOrientationMaskLandscapeLeft
|
166
|
+
when "UIInterfaceOrientationLandscapeRight"
|
167
|
+
ors |= UIInterfaceOrientationMaskLandscapeRight
|
168
|
+
when "UIInterfaceOrientationPortraitUpsideDown"
|
169
|
+
ors |= UIInterfaceOrientationMaskPortraitUpsideDown
|
170
|
+
end
|
171
|
+
end
|
172
|
+
ors
|
173
|
+
end
|
111
174
|
end
|
112
175
|
|
113
176
|
# Class methods
|
114
177
|
class Screen
|
115
178
|
class << self
|
179
|
+
def debug_mode
|
180
|
+
@debug_mode
|
181
|
+
end
|
182
|
+
|
183
|
+
def debug_mode=(v)
|
184
|
+
@debug_mode = v
|
185
|
+
end
|
186
|
+
|
187
|
+
def current_screen=(s)
|
188
|
+
@current_screen = s
|
189
|
+
end
|
190
|
+
|
191
|
+
def current_screen
|
192
|
+
@current_screen
|
193
|
+
end
|
194
|
+
|
116
195
|
def title(t)
|
117
196
|
@title = t
|
118
197
|
end
|
@@ -1,34 +1,6 @@
|
|
1
1
|
module ProMotion
|
2
2
|
class TabBar
|
3
3
|
class << self
|
4
|
-
# def tab_bar_item(args = {})
|
5
|
-
# title = "Untitled"
|
6
|
-
# title = args[:title] if args[:title]
|
7
|
-
# args[:tag] ||= 0
|
8
|
-
|
9
|
-
# tb_item = tab_bar_icon(args[:system_icon], args[:tag]) if args[:system_icon]
|
10
|
-
# tb_item = tab_bar_icon_custom(title, args[:icon], args[:tag]) if args[:icon]
|
11
|
-
|
12
|
-
# if tb_item
|
13
|
-
# tb_item.badgeValue = args[:badge_number].to_s unless args[:badge_number].nil? || tab[:badge_number] <= 0
|
14
|
-
|
15
|
-
# return tb_item
|
16
|
-
# end
|
17
|
-
# nil
|
18
|
-
# end
|
19
|
-
|
20
|
-
# def tab_bar_icon(icon, tag)
|
21
|
-
# return UITabBarItem.alloc.initWithTabBarSystemItem(icon, tag: tag)
|
22
|
-
# end
|
23
|
-
|
24
|
-
# def tab_bar_icon_custom(title, image_name, tag)
|
25
|
-
# icon_image = UIImage.imageNamed(image_name)
|
26
|
-
# return UITabBarItem.alloc.initWithTitle(title, image:icon_image, tag:tag)
|
27
|
-
# end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
4
|
def create_tab_bar_controller_from_data(data)
|
33
5
|
data = self.setTags(data)
|
34
6
|
|
@@ -27,32 +27,51 @@ module ProMotion::MotionTable
|
|
27
27
|
|
28
28
|
# Number of cells
|
29
29
|
def tableView(tableView, numberOfRowsInSection:section)
|
30
|
-
return sectionAtIndex(section)[:cells].length if sectionAtIndex(section)
|
30
|
+
return sectionAtIndex(section)[:cells].length if sectionAtIndex(section) && sectionAtIndex(section)[:cells]
|
31
31
|
0
|
32
32
|
end
|
33
33
|
|
34
34
|
def tableView(tableView, titleForHeaderInSection:section)
|
35
|
-
return sectionAtIndex(section)[:title] if sectionAtIndex(section)
|
35
|
+
return sectionAtIndex(section)[:title] if sectionAtIndex(section) && sectionAtIndex(section)[:title]
|
36
36
|
end
|
37
37
|
|
38
38
|
# Set table_data_index if you want the right hand index column (jumplist)
|
39
39
|
def sectionIndexTitlesForTableView(tableView)
|
40
|
-
self.
|
40
|
+
if self.respond_to?(:table_data_index)
|
41
|
+
self.table_data_index
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
45
|
def tableView(tableView, cellForRowAtIndexPath:indexPath)
|
46
|
+
# Aah, magic happens here...
|
47
|
+
|
44
48
|
dataCell = cellAtSectionAndIndex(indexPath.section, indexPath.row)
|
49
|
+
return UITableViewCell.alloc.init unless dataCell
|
45
50
|
dataCell[:cellStyle] ||= UITableViewCellStyleDefault
|
46
|
-
|
47
|
-
cellIdentifier =
|
51
|
+
dataCell[:cellIdentifier] ||= "Cell"
|
52
|
+
cellIdentifier = dataCell[:cellIdentifier]
|
53
|
+
dataCell[:cellClass] ||= PM::TableViewCell
|
48
54
|
|
49
55
|
tableCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)
|
50
56
|
unless tableCell
|
51
|
-
tableCell =
|
57
|
+
tableCell = dataCell[:cellClass].alloc.initWithStyle(dataCell[:cellStyle], reuseIdentifier:cellIdentifier)
|
58
|
+
|
59
|
+
# Add optimizations here
|
60
|
+
tableCell.layer.masksToBounds = true if dataCell[:masksToBounds]
|
61
|
+
tableCell.backgroundColor = dataCell[:backgroundColor] if dataCell[:backgroundColor]
|
62
|
+
tableCell.selectionStyle = dataCell[:selectionStyle] if dataCell[:selectionStyle]
|
63
|
+
tableCell.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin
|
64
|
+
end
|
65
|
+
|
66
|
+
if dataCell[:cellClassAttributes]
|
67
|
+
set_cell_attributes tableCell, dataCell[:cellClassAttributes]
|
68
|
+
end
|
69
|
+
|
70
|
+
if dataCell[:accessoryView]
|
71
|
+
tableCell.accessoryView = dataCell[:accessoryView]
|
72
|
+
tableCell.accessoryView.autoresizingMask = UIViewAutoresizingFlexibleWidth
|
52
73
|
end
|
53
74
|
|
54
|
-
tableCell.accessoryView = dataCell[:accessoryView] if dataCell[:accessoryView]
|
55
|
-
|
56
75
|
if dataCell[:accessory] && dataCell[:accessory] == :switch
|
57
76
|
switchView = UISwitch.alloc.initWithFrame(CGRectZero)
|
58
77
|
switchView.addTarget(self, action: "accessoryToggledSwitch:", forControlEvents:UIControlEventValueChanged);
|
@@ -62,19 +81,44 @@ module ProMotion::MotionTable
|
|
62
81
|
|
63
82
|
if dataCell[:subtitle]
|
64
83
|
tableCell.detailTextLabel.text = dataCell[:subtitle]
|
84
|
+
tableCell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth
|
65
85
|
end
|
66
86
|
|
67
87
|
tableCell.selectionStyle = UITableViewCellSelectionStyleNone if dataCell[:no_select]
|
68
88
|
|
69
|
-
if dataCell[:
|
89
|
+
if dataCell[:remoteImage]
|
90
|
+
if tableCell.imageView.respond_to?("setImageWithURL:placeholderImage:")
|
91
|
+
url = dataCell[:remoteImage][:url]
|
92
|
+
url = NSURL.URLWithString(url) unless url.is_a?(NSURL)
|
93
|
+
placeholder = dataCell[:remoteImage][:placeholder]
|
94
|
+
placeholder = UIImage.imageNamed(placeholder) if placeholder.is_a?(String)
|
95
|
+
|
96
|
+
tableCell.image_size = dataCell[:remoteImage][:size] if dataCell[:remoteImage][:size] && tableCell.respond_to?("image_size=")
|
97
|
+
tableCell.imageView.setImageWithURL(url, placeholderImage: placeholder)
|
98
|
+
tableCell.imageView.layer.masksToBounds = true
|
99
|
+
tableCell.imageView.layer.cornerRadius = dataCell[:remoteImage][:radius]
|
100
|
+
else
|
101
|
+
ProMotion::MotionTable::Console.log("ProMotion Warning: to use remoteImage with TableScreen you need to include the CocoaPod 'SDWebImage'.", withColor: MotionTable::Console::RED_COLOR)
|
102
|
+
end
|
103
|
+
elsif dataCell[:image]
|
70
104
|
tableCell.imageView.layer.masksToBounds = true
|
71
105
|
tableCell.imageView.image = dataCell[:image][:image]
|
72
106
|
tableCell.imageView.layer.cornerRadius = dataCell[:image][:radius] if dataCell[:image][:radius]
|
73
107
|
end
|
74
108
|
|
75
109
|
if dataCell[:subViews]
|
110
|
+
tag_number = 0
|
76
111
|
dataCell[:subViews].each do |view|
|
77
|
-
|
112
|
+
# Remove an existing view at that tag number
|
113
|
+
tag_number += 1
|
114
|
+
existing_view = tableCell.viewWithTag(tag_number)
|
115
|
+
existing_view.removeFromSuperview if existing_view
|
116
|
+
|
117
|
+
# Add the subview if it exists
|
118
|
+
if view
|
119
|
+
view.tag = tag_number
|
120
|
+
tableCell.addSubview view
|
121
|
+
end
|
78
122
|
end
|
79
123
|
end
|
80
124
|
|
@@ -82,12 +126,33 @@ module ProMotion::MotionTable
|
|
82
126
|
tableCell.addSubview dataCell[:details][:image]
|
83
127
|
end
|
84
128
|
|
85
|
-
|
129
|
+
if dataCell[:styles] && dataCell[:styles][:textLabel] && dataCell[:styles][:textLabel][:frame]
|
130
|
+
ui_label = false
|
131
|
+
tableCell.contentView.subviews.each do |view|
|
132
|
+
if view.is_a? UILabel
|
133
|
+
ui_label = true
|
134
|
+
view.text = dataCell[:styles][:textLabel][:text]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
unless ui_label == true
|
139
|
+
label ||= UILabel.alloc.initWithFrame(CGRectZero)
|
140
|
+
set_cell_attributes label, dataCell[:styles][:textLabel]
|
141
|
+
tableCell.contentView.addSubview label
|
142
|
+
end
|
143
|
+
# hackery
|
144
|
+
tableCell.textLabel.textColor = UIColor.clearColor
|
145
|
+
else
|
146
|
+
cell_title = dataCell[:title]
|
147
|
+
cell_title ||= ""
|
148
|
+
tableCell.textLabel.text = cell_title
|
149
|
+
end
|
150
|
+
|
86
151
|
return tableCell
|
87
152
|
end
|
88
153
|
|
89
154
|
def sectionAtIndex(index)
|
90
|
-
if @mt_filtered
|
155
|
+
if @mt_filtered
|
91
156
|
@mt_filtered_data.at(index)
|
92
157
|
else
|
93
158
|
@mt_table_view_groups.at(index)
|
@@ -101,6 +166,8 @@ module ProMotion::MotionTable
|
|
101
166
|
def tableView(tableView, didSelectRowAtIndexPath:indexPath)
|
102
167
|
cell = cellAtSectionAndIndex(indexPath.section, indexPath.row)
|
103
168
|
tableView.deselectRowAtIndexPath(indexPath, animated: true);
|
169
|
+
cell[:arguments] ||= {}
|
170
|
+
cell[:arguments][:cell] = cell if cell[:arguments].is_a?(Hash)
|
104
171
|
triggerAction(cell[:action], cell[:arguments]) if cell[:action]
|
105
172
|
end
|
106
173
|
|
@@ -124,12 +191,29 @@ module ProMotion::MotionTable
|
|
124
191
|
elsif expectedArguments == 1 || expectedArguments == -1
|
125
192
|
self.send(action, arguments)
|
126
193
|
else
|
127
|
-
MotionTable::Console.log("MotionTable warning: #{action} expects #{expectedArguments} arguments. Maximum number of required arguments for an action is 1.", withColor: MotionTable::Console::RED_COLOR)
|
194
|
+
ProMotion::MotionTable::Console.log("MotionTable warning: #{action} expects #{expectedArguments} arguments. Maximum number of required arguments for an action is 1.", withColor: MotionTable::Console::RED_COLOR)
|
128
195
|
end
|
129
196
|
else
|
130
|
-
MotionTable::Console.log(self, actionNotImplemented: action)
|
197
|
+
ProMotion::MotionTable::Console.log(self, actionNotImplemented: action)
|
131
198
|
end
|
132
199
|
end
|
133
|
-
|
200
|
+
|
201
|
+
def set_cell_attributes(element, args = {})
|
202
|
+
args.each do |k, v|
|
203
|
+
if v.is_a? Hash
|
204
|
+
v.each do
|
205
|
+
sub_element = element.send("#{k}")
|
206
|
+
set_cell_attributes(sub_element, v)
|
207
|
+
end
|
208
|
+
# v.each do |k2, v2|
|
209
|
+
# sub_element = element.send("#{k}")
|
210
|
+
# sub_element.send("#{k2}=", v2) if sub_element.respond_to?("#{k2}=")
|
211
|
+
# end
|
212
|
+
else
|
213
|
+
element.send("#{k}=", v) if element.respond_to?("#{k}=")
|
214
|
+
end
|
215
|
+
end
|
216
|
+
element
|
217
|
+
end
|
134
218
|
end
|
135
219
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ProMotion
|
2
|
+
module SystemHelper
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def ios_version
|
6
|
+
UIDevice.currentDevice.systemVersion
|
7
|
+
end
|
8
|
+
|
9
|
+
def ios_version_is?(version)
|
10
|
+
ios_version == version
|
11
|
+
end
|
12
|
+
|
13
|
+
def ios_version_greater?(version)
|
14
|
+
ios_version > version
|
15
|
+
end
|
16
|
+
|
17
|
+
def ios_version_greater_eq?(version)
|
18
|
+
ios_version >= version
|
19
|
+
end
|
20
|
+
|
21
|
+
def ios_version_less?(version)
|
22
|
+
ios_version < version
|
23
|
+
end
|
24
|
+
|
25
|
+
def ios_version_less_eq?(version)
|
26
|
+
ios_version <= version
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/ProMotion/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ProMotion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-12-03 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description: ProMotion is a new way to organize RubyMotion apps.
|
17
17
|
email:
|
@@ -38,6 +38,7 @@ files:
|
|
38
38
|
- lib/ProMotion/Console.rb
|
39
39
|
- lib/ProMotion/ProMotion.rb
|
40
40
|
- lib/ProMotion/_ext/NavigationController.rb
|
41
|
+
- lib/ProMotion/_ext/TableViewCell.rb
|
41
42
|
- lib/ProMotion/_ext/TableViewController.rb
|
42
43
|
- lib/ProMotion/_ext/ViewController.rb
|
43
44
|
- lib/ProMotion/_modules/ScreenElements.rb
|
@@ -54,6 +55,7 @@ files:
|
|
54
55
|
- lib/ProMotion/helpers/motion-table/2nd/grouped_table.rb
|
55
56
|
- lib/ProMotion/helpers/motion-table/2nd/plain_table.rb
|
56
57
|
- lib/ProMotion/helpers/motion-table/console.rb
|
58
|
+
- lib/ProMotion/helpers/system_helper.rb
|
57
59
|
- lib/ProMotion/version.rb
|
58
60
|
homepage: https://github.com/clearsightstudio/ProMotion
|
59
61
|
licenses: []
|