motion-prime 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/ROADMAP.md +3 -0
- data/files/Gemfile +1 -1
- data/lib/motion-prime.rb +1 -1
- data/motion-prime/api_client.rb +7 -5
- data/motion-prime/elements/_content_text_mixin.rb +14 -4
- data/motion-prime/elements/_text_mixin.rb +6 -2
- data/motion-prime/elements/base_element.rb +37 -12
- data/motion-prime/elements/button.rb +1 -1
- data/motion-prime/elements/draw.rb +6 -0
- data/motion-prime/elements/draw/_draw_background_mixin.rb +33 -2
- data/motion-prime/elements/draw/image.rb +9 -5
- data/motion-prime/elements/draw/label.rb +1 -1
- data/motion-prime/elements/label.rb +1 -1
- data/motion-prime/helpers/has_normalizer.rb +2 -1
- data/motion-prime/helpers/has_style_options.rb +16 -0
- data/motion-prime/helpers/has_styles.rb +5 -1
- data/motion-prime/models/_association_mixin.rb +17 -2
- data/motion-prime/models/_base_mixin.rb +5 -1
- data/motion-prime/models/_dirty_mixin.rb +1 -1
- data/motion-prime/models/_nano_bag_mixin.rb +18 -5
- data/motion-prime/models/_sync_mixin.rb +3 -3
- data/motion-prime/models/_timestamps_mixin.rb +3 -3
- data/motion-prime/sections/_draw_section_mixin.rb +20 -3
- data/motion-prime/sections/_section_with_container_mixin.rb +1 -1
- data/motion-prime/sections/abstract_collection.rb +6 -2
- data/motion-prime/sections/base_section.rb +6 -6
- data/motion-prime/sections/collection/collection_delegate.rb +6 -4
- data/motion-prime/sections/form/base_field_section.rb +8 -0
- data/motion-prime/sections/page_view.rb +19 -5
- data/motion-prime/sections/page_view/page_view_delegate.rb +19 -6
- data/motion-prime/sections/table/refresh_mixin.rb +1 -1
- data/motion-prime/sections/table/table_delegate.rb +6 -4
- data/motion-prime/styles/base.rb +1 -1
- data/motion-prime/support/consts.rb +6 -1
- data/motion-prime/support/mp_table_view.rb +4 -4
- data/motion-prime/version.rb +1 -1
- data/motion-prime/views/styles.rb +1 -1
- data/motion-prime/views/view_builder.rb +9 -5
- data/motion-prime/views/view_styler.rb +16 -15
- metadata +37 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c05d314976c62a856091891705c135ec7efcec22
|
4
|
+
data.tar.gz: c36d99bc5fbd5c2220d0eac3677d87dbc0acf4b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89864fab09b0b64a7c1ad1610300141c5ae60296a4a858e7abb83ceecf1277ebd3ff027886a061e1e022e1df551e9270b24f435a12f33d34973e7d4940d72e35
|
7
|
+
data.tar.gz: 6c83f9726a57b620a1d2f93fd0e8e8b2089d3e71de9f5bea27acd279f98ad9a9f536bd247d1b4fd42822cc31341510d3ce82316eba8b49314ca8a71ee7dc5829
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 1.0.4
|
2
|
+
* Multiple bug fixes
|
3
|
+
* Model#save will be performed on main thread (now you can fetch models in thread)
|
4
|
+
* Improved support for UIPageViewController
|
5
|
+
|
1
6
|
=== 1.0.3
|
2
7
|
* Fixed issue with overriding background color
|
3
8
|
* Improved support for UIPageViewController
|
data/Gemfile.lock
CHANGED
data/ROADMAP.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
=== 1.1.0
|
2
|
+
* Model.fetch should always return status of main model fetch response
|
2
3
|
* grid item width should be calculated based on uicollectionview with.
|
3
4
|
* ability to change access token param name.
|
4
5
|
* bug: if mp label do not have text and was set as hidden, it should unhide after setting text.
|
@@ -7,6 +8,8 @@
|
|
7
8
|
* bug: dealloc of Prime::Section will not be called for cell created in collection_data using #map.
|
8
9
|
* bug: images does not render after reload table if using draw_with_layer (prerender not enabled).
|
9
10
|
* bug: incorrect height (cropped) for draw label with lineSpacing in cases when there is just one line.
|
11
|
+
* use one style to set rounded corners for view/draw elements (remove :rounded_corners option)
|
12
|
+
* add :sides option to BaseElement border (like in draw)
|
10
13
|
* add dsl for push notifications.
|
11
14
|
* add some extensions/middleware system, at least for networking.
|
12
15
|
* create "display_network_error" extension.
|
data/files/Gemfile
CHANGED
data/lib/motion-prime.rb
CHANGED
@@ -18,7 +18,7 @@ Motion::Project::App.setup do |app|
|
|
18
18
|
app.pods do
|
19
19
|
pod 'NanoStore', '~> 2.7.7'
|
20
20
|
pod 'SDWebImage'
|
21
|
-
pod 'SVPullToRefresh', git: '
|
21
|
+
pod 'SVPullToRefresh', git: 'https://github.com/droidlabs/SVPullToRefresh.git'
|
22
22
|
pod 'MBAlertView'
|
23
23
|
pod 'MBProgressHUD', '~> 0.8'
|
24
24
|
end
|
data/motion-prime/api_client.rb
CHANGED
@@ -43,13 +43,12 @@ class ApiClient
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def page_url(path)
|
46
|
-
|
46
|
+
path_with_base(path, config.base)
|
47
47
|
end
|
48
48
|
|
49
49
|
def resource_url(path)
|
50
|
-
# return if path.blank?
|
51
50
|
base = config.resource_base? ? config.resource_base : config.base
|
52
|
-
|
51
|
+
path_with_base(path, base)
|
53
52
|
end
|
54
53
|
|
55
54
|
def request(method, path, params = {}, options = {}, &block)
|
@@ -73,7 +72,7 @@ class ApiClient
|
|
73
72
|
|
74
73
|
def request!(method, path, data, files = nil, options = {}, &block)
|
75
74
|
use_callback = block_given?
|
76
|
-
path =
|
75
|
+
path = path_with_base(path, config.api_namespace)
|
77
76
|
client_method = files.present? ? :"multipart_#{method}" : method
|
78
77
|
AFMotion::Client.shared.send client_method, path, data do |response, form_data, progress|
|
79
78
|
if form_data && files.present?
|
@@ -131,7 +130,6 @@ class ApiClient
|
|
131
130
|
|
132
131
|
# TODO: temporary solution, add real caching system here
|
133
132
|
def read_cache(key)
|
134
|
-
puts "read cache #{key}"
|
135
133
|
@cache ||= {}
|
136
134
|
@cache[key]
|
137
135
|
end
|
@@ -143,6 +141,10 @@ class ApiClient
|
|
143
141
|
end
|
144
142
|
|
145
143
|
protected
|
144
|
+
def path_with_base(path, base)
|
145
|
+
path.to_s.starts_with?('http') ? path : "#{base}#{path}"
|
146
|
+
end
|
147
|
+
|
146
148
|
def allow_queue?(method, path, options)
|
147
149
|
options[:allow_queue] && config.allow_queue?
|
148
150
|
end
|
@@ -35,15 +35,22 @@ module MotionPrime
|
|
35
35
|
@content_width = width_for_attributed_text(current_attributed_text)
|
36
36
|
end
|
37
37
|
|
38
|
+
def multiline_content_width
|
39
|
+
unless computed_options[:width]
|
40
|
+
Prime.logger.error "Please set element width for multiline content width calculation (`#{self.name}` in section `#{section.try(:name)}`)"
|
41
|
+
end
|
42
|
+
width_for_attributed_text(current_attributed_text, computed_options[:width] - content_padding_width)
|
43
|
+
end
|
44
|
+
|
38
45
|
def width_for_text(text)
|
39
46
|
width_for_attributed_text(attributed_text_for_text(text))
|
40
47
|
end
|
41
48
|
|
42
|
-
def width_for_attributed_text(attributed_text)
|
49
|
+
def width_for_attributed_text(attributed_text, width = Float::MAX)
|
43
50
|
min, max = computed_options[:min_width].to_f, computed_options[:max_width]
|
44
51
|
return min if attributed_text.to_s.blank?
|
45
52
|
|
46
|
-
rect = get_content_rect(attributed_text,
|
53
|
+
rect = get_content_rect(attributed_text, width)
|
47
54
|
[[rect.size.width.ceil, max].compact.min, min].max.ceil
|
48
55
|
end
|
49
56
|
|
@@ -61,6 +68,9 @@ module MotionPrime
|
|
61
68
|
|
62
69
|
def height_for_attributed_text(attributed_text)
|
63
70
|
min, max = computed_options[:min_height].to_f, computed_options[:max_height]
|
71
|
+
unless computed_options[:width]
|
72
|
+
Prime.logger.error "Please set element width for content height calculation (`#{self.name}` in section `#{section.try(:name)}`)"
|
73
|
+
end
|
64
74
|
return min if attributed_text.to_s.blank?
|
65
75
|
rect = get_content_rect(attributed_text, computed_options[:width] - content_padding_width)
|
66
76
|
[[rect.size.height.ceil, max].compact.min, min].max.ceil
|
@@ -92,7 +102,7 @@ module MotionPrime
|
|
92
102
|
end
|
93
103
|
|
94
104
|
def button_content_font
|
95
|
-
computed_options[:title_label]
|
105
|
+
extract_font_from(computed_options[:title_label])
|
96
106
|
end
|
97
107
|
|
98
108
|
def input_content_text
|
@@ -101,7 +111,7 @@ module MotionPrime
|
|
101
111
|
|
102
112
|
# TODO: normalize_object will not be required after refactoring computed options.
|
103
113
|
def input_content_font
|
104
|
-
font = input_value_text.blank? ? computed_options
|
114
|
+
font = input_value_text.blank? ? extract_font_from(computed_options, 'placeholder') : extract_font_from(computed_options)
|
105
115
|
normalize_object(font, section || self)
|
106
116
|
end
|
107
117
|
|
@@ -71,8 +71,12 @@ module MotionPrime
|
|
71
71
|
end
|
72
72
|
attributes[NSParagraphStyleAttributeName] = paragrah_style
|
73
73
|
end
|
74
|
-
|
75
|
-
|
74
|
+
if color = options[:text_color] || options[:title_color]
|
75
|
+
attributes[NSForegroundColorAttributeName] = color.uicolor
|
76
|
+
end
|
77
|
+
if font = extract_font_from(options)
|
78
|
+
attributes[NSFontAttributeName] = font.uifont
|
79
|
+
end
|
76
80
|
[attributes, paragrah_style]
|
77
81
|
end
|
78
82
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
motion_require '../helpers/has_normalizer'
|
2
2
|
motion_require '../helpers/has_style_chain_builder'
|
3
3
|
motion_require '../helpers/has_class_factory'
|
4
|
+
motion_require '../helpers/has_style_options'
|
4
5
|
module MotionPrime
|
5
6
|
class BaseElement
|
6
7
|
# MotionPrime::BaseElement is container for UIView class elements with options.
|
@@ -10,6 +11,7 @@ module MotionPrime
|
|
10
11
|
include HasNormalizer
|
11
12
|
include HasStyleChainBuilder
|
12
13
|
include HasClassFactory
|
14
|
+
include HasStyleOptions
|
13
15
|
extend HasClassFactory
|
14
16
|
|
15
17
|
attr_accessor :options, :section, :name,
|
@@ -54,6 +56,14 @@ module MotionPrime
|
|
54
56
|
self.view.addTarget(target || section, action: action, forControlEvents: event.uicontrolevent)
|
55
57
|
end
|
56
58
|
|
59
|
+
def notify_section_before_render
|
60
|
+
section.try(:before_element_render, self)
|
61
|
+
end
|
62
|
+
|
63
|
+
def notify_section_after_render
|
64
|
+
section.try(:after_element_render, self)
|
65
|
+
end
|
66
|
+
|
57
67
|
def render(options = {}, &block)
|
58
68
|
run_callbacks :render do
|
59
69
|
render!(options, &block)
|
@@ -82,10 +92,10 @@ module MotionPrime
|
|
82
92
|
block_options = compute_block_options || {}
|
83
93
|
raw_options = self.options.except(:screen, :name, :block, :view_class).merge(block_options)
|
84
94
|
compute_style_options(raw_options)
|
85
|
-
raw_options = Styles.for(styles).
|
95
|
+
raw_options = Styles.for(styles).deep_merge(raw_options)
|
86
96
|
@computed_options = raw_options
|
87
97
|
normalize_options(@computed_options, section.try(:elements_eval_object), %w[
|
88
|
-
font text placeholder title_label
|
98
|
+
font font_name font_size text placeholder title_label
|
89
99
|
padding padding_left padding_right padding_top padding_bottom
|
90
100
|
left right min_width min_outer_width max_width max_outer_width width
|
91
101
|
top bottom min_height min_outer_height max_height max_outer_height height])
|
@@ -104,18 +114,27 @@ module MotionPrime
|
|
104
114
|
if (changed_options & [:text, :size_to_fit]).any? && respond_to?(:size_to_fit)
|
105
115
|
size_to_fit
|
106
116
|
end
|
107
|
-
section.try(:on_element_render, self)
|
108
117
|
end
|
109
118
|
|
110
119
|
def update_with_options(new_options = {})
|
111
|
-
options.
|
120
|
+
options.deep_merge!(new_options)
|
112
121
|
reload!
|
122
|
+
computed_options.deep_merge!(new_options)
|
113
123
|
rerender!(new_options.keys)
|
114
124
|
end
|
115
125
|
|
116
126
|
def update_options(new_options)
|
117
|
-
options.
|
127
|
+
options.deep_merge!(new_options)
|
118
128
|
return unless view
|
129
|
+
|
130
|
+
required_options = if new_options.slice(:width, :height, :top, :left, :right, :bottom).any?
|
131
|
+
new_options[:calculate_frame] = true
|
132
|
+
[:width, :height, :top, :left, :right, :bottom]
|
133
|
+
elsif new_options.slice(:text, :title).any?
|
134
|
+
[:line_spacing, :line_height, :underline, :fragment_color, :text_alignment, :font, :font_name, :font_size, :line_break_mode, :number_of_lines]
|
135
|
+
end
|
136
|
+
new_options = computed_options.slice(*Array.wrap(required_options)).merge(new_options)
|
137
|
+
|
119
138
|
ViewStyler.new(view, view.superview.try(:bounds), new_options).apply
|
120
139
|
end
|
121
140
|
|
@@ -161,11 +180,10 @@ module MotionPrime
|
|
161
180
|
end
|
162
181
|
|
163
182
|
def compute_style_options(*style_sources)
|
164
|
-
has_errors = section.respond_to?(:observing_errors?) && observing_errors? && has_errors?
|
165
|
-
|
166
183
|
@styles = []
|
167
184
|
if cell_section?
|
168
|
-
|
185
|
+
suffixes = section.style_suffixes if section.respond_to?(:style_suffixes)
|
186
|
+
@styles += compute_cell_style_options(style_sources, Array.wrap(suffixes))
|
169
187
|
end
|
170
188
|
|
171
189
|
mixins = []
|
@@ -189,11 +207,11 @@ module MotionPrime
|
|
189
207
|
|
190
208
|
# custom style (from options or block options), using for TableViews as well
|
191
209
|
@styles += custom_styles
|
192
|
-
# pp
|
210
|
+
# pp(@view_class.to_s + @styles.inspect); puts()
|
193
211
|
@styles
|
194
212
|
end
|
195
213
|
|
196
|
-
def compute_cell_style_options(style_sources,
|
214
|
+
def compute_cell_style_options(style_sources, additional_suffixes)
|
197
215
|
base_styles = {common: [], specific: []}
|
198
216
|
suffixes = {common: [], specific: []}
|
199
217
|
all_styles = []
|
@@ -208,13 +226,17 @@ module MotionPrime
|
|
208
226
|
# form element: _input
|
209
227
|
# table element: _image
|
210
228
|
suffixes[:common] << @view_name.to_sym
|
211
|
-
|
229
|
+
additional_suffixes.each do |additional_suffix|
|
230
|
+
suffixes[:common] << [@view_name, additional_suffix].join('_').to_sym
|
231
|
+
end
|
212
232
|
end
|
213
233
|
if name && name.to_s != @view_name
|
214
234
|
# form element: _input
|
215
235
|
# table element: _icon
|
216
236
|
suffixes[:specific] << name.to_sym
|
217
|
-
|
237
|
+
additional_suffixes.each do |additional_suffix|
|
238
|
+
suffixes[:specific] << [name, additional_suffix].join('_').to_sym
|
239
|
+
end
|
218
240
|
end
|
219
241
|
# form cell: base_form_field, base_form_string_field
|
220
242
|
# form element: base_form_field_string_field, base_form_string_field_text_field, base_form_string_field_input
|
@@ -259,5 +281,8 @@ module MotionPrime
|
|
259
281
|
set_callback :render, :after, method_name
|
260
282
|
end
|
261
283
|
end
|
284
|
+
|
285
|
+
before_render :notify_section_before_render
|
286
|
+
after_render :notify_section_after_render
|
262
287
|
end
|
263
288
|
end
|
@@ -17,12 +17,18 @@ module MotionPrime
|
|
17
17
|
corner_radius: options[:layer].try(:[], :corner_radius).to_f,
|
18
18
|
border_width: options[:layer].try(:[], :border_width).to_f,
|
19
19
|
border_color: options[:layer].try(:[], :border_color).try(:uicolor) || background_color,
|
20
|
+
border_sides: options[:layer].try(:[], :border_sides),
|
20
21
|
dashes: options[:layer].try(:[], :dashes),
|
21
22
|
}
|
22
23
|
end
|
23
24
|
|
24
25
|
def render!; end
|
25
26
|
|
27
|
+
def on_container_render
|
28
|
+
@view = nil
|
29
|
+
@computed_frame = nil
|
30
|
+
end
|
31
|
+
|
26
32
|
def view
|
27
33
|
@view ||= section.container_view
|
28
34
|
end
|
@@ -3,7 +3,7 @@ module MotionPrime
|
|
3
3
|
def draw_background_in_context(context = nil)
|
4
4
|
context ||= UIGraphicsGetCurrentContext()
|
5
5
|
options = draw_options
|
6
|
-
rect, background_color, border_width, border_color, corner_radius, dashes_array = options.slice(:rect, :background_color, :border_width, :border_color, :corner_radius, :dashes).values
|
6
|
+
rect, background_color, border_width, border_color, border_sides, corner_radius, dashes_array = options.slice(:rect, :background_color, :border_width, :border_color, :border_sides, :corner_radius, :dashes).values
|
7
7
|
|
8
8
|
return unless background_color || border_width > 0
|
9
9
|
|
@@ -34,7 +34,38 @@ module MotionPrime
|
|
34
34
|
CGContextSetLineDash(context, dashes_array.count, dashes, 0) if dashes
|
35
35
|
CGContextSetLineWidth(context, border_width)
|
36
36
|
CGContextSetStrokeColorWithColor(context, border_color.uicolor.cgcolor)
|
37
|
-
|
37
|
+
if border_sides.present?
|
38
|
+
points = [
|
39
|
+
[rect.origin.x, rect.origin.y],
|
40
|
+
[rect.origin.x + rect.size.width, rect.origin.y],
|
41
|
+
[rect.origin.x + rect.size.width, rect.origin.y + rect.size.height],
|
42
|
+
[rect.origin.x, rect.origin.y + rect.size.height]
|
43
|
+
]
|
44
|
+
CGContextMoveToPoint(context, *points[0])
|
45
|
+
if border_sides.include?(:top)
|
46
|
+
CGContextAddLineToPoint(context, *points[1])
|
47
|
+
else
|
48
|
+
CGContextMoveToPoint(context, *points[1])
|
49
|
+
end
|
50
|
+
if border_sides.include?(:right)
|
51
|
+
CGContextAddLineToPoint(context, *points[2])
|
52
|
+
else
|
53
|
+
CGContextMoveToPoint(context, *points[2])
|
54
|
+
end
|
55
|
+
if border_sides.include?(:bottom)
|
56
|
+
CGContextAddLineToPoint(context, *points[3])
|
57
|
+
else
|
58
|
+
CGContextMoveToPoint(context, *points[3])
|
59
|
+
end
|
60
|
+
if border_sides.include?(:left)
|
61
|
+
CGContextAddLineToPoint(context, *points[0])
|
62
|
+
else
|
63
|
+
CGContextMoveToPoint(context, *points[0])
|
64
|
+
end
|
65
|
+
CGContextStrokePath(context)
|
66
|
+
else
|
67
|
+
CGContextStrokeRect(context, rect)
|
68
|
+
end
|
38
69
|
end
|
39
70
|
CGContextSetFillColorWithColor(context, background_color.uicolor.cgcolor) if background_color
|
40
71
|
CGContextFillRect(context, rect) if background_color
|
@@ -9,7 +9,10 @@ module MotionPrime
|
|
9
9
|
image ||= computed_options[:default] if computed_options[:url]
|
10
10
|
|
11
11
|
# already initialized image or image from resources or default image
|
12
|
-
super.merge({
|
12
|
+
super.merge({
|
13
|
+
image: image.try(:uiimage),
|
14
|
+
inner_rect: CGRectMake(frame_inner_left, frame_inner_top, frame_width, frame_height)
|
15
|
+
})
|
13
16
|
end
|
14
17
|
|
15
18
|
def draw_in(rect)
|
@@ -32,7 +35,7 @@ module MotionPrime
|
|
32
35
|
|
33
36
|
border_width = options[:border_width]
|
34
37
|
inset = border_width > 0 ? (border_width - 1 ).abs*0.5 : 0
|
35
|
-
rect = CGRectInset(options[:
|
38
|
+
rect = CGRectInset(options[:inner_rect], inset, inset)
|
36
39
|
radius = options[:corner_radius].to_f if options[:corner_radius] && options[:masks_to_bounds]
|
37
40
|
|
38
41
|
UIGraphicsPushContext(context)
|
@@ -52,9 +55,9 @@ module MotionPrime
|
|
52
55
|
|
53
56
|
def draw_with_layer
|
54
57
|
options = draw_options
|
55
|
-
@layer.removeFromSuperlayer
|
58
|
+
@layer.try(:removeFromSuperlayer)
|
56
59
|
return unless image = options[:image]
|
57
|
-
rect = options[:
|
60
|
+
rect = options[:inner_rect]
|
58
61
|
radius = options[:corner_radius].to_f if options[:corner_radius] && options[:masks_to_bounds]
|
59
62
|
|
60
63
|
@layer = CALayer.layer
|
@@ -106,8 +109,9 @@ module MotionPrime
|
|
106
109
|
end
|
107
110
|
|
108
111
|
def update_with_options(new_options = {})
|
112
|
+
self.image_data = nil if new_options.slice(:url, :image).any? || new_options.blank?
|
113
|
+
@layer.try(:removeFromSuperlayer)
|
109
114
|
super
|
110
|
-
self.image_data = nil if new_options.slice(:url, :image).any?
|
111
115
|
end
|
112
116
|
end
|
113
117
|
end
|
@@ -9,7 +9,7 @@ module MotionPrime
|
|
9
9
|
options = computed_options
|
10
10
|
text = (options[:html] || options[:text]).to_s.gsub(/\A[\n\r]+/, '')
|
11
11
|
text_color = (options[:text_color] || :black).uicolor
|
12
|
-
font = (options
|
12
|
+
font = (extract_font_from(options) || :system).uifont
|
13
13
|
|
14
14
|
text_alignment_name = options.fetch(:text_alignment, :left)
|
15
15
|
text_alignment = text_alignment_name.nstextalignment
|
@@ -31,7 +31,7 @@ module MotionPrime
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_text(value)
|
34
|
-
computed_options[:text] = value
|
34
|
+
options[:text] = computed_options[:text] = value
|
35
35
|
styler = ViewStyler.new(view, CGRectZero, computed_options)
|
36
36
|
if styler.options[:attributed_text]
|
37
37
|
view.attributedText = styler.options[:attributed_text]
|