bubble-wrap 1.1.5 → 1.2.0.pre
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 +15 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +25 -1
- data/Gemfile.lock +1 -1
- data/README.md +126 -5
- data/lib/bubble-wrap/all.rb +1 -1
- data/lib/bubble-wrap/camera.rb +2 -1
- data/lib/bubble-wrap/core.rb +1 -2
- data/lib/bubble-wrap/font.rb +2 -0
- data/lib/bubble-wrap/location.rb +2 -0
- data/lib/bubble-wrap/version.rb +1 -1
- data/motion/core/app.rb +17 -0
- data/motion/core/device/camera.rb +5 -25
- data/motion/font/font.rb +85 -0
- data/motion/http.rb +32 -12
- data/motion/location/location.rb +19 -17
- data/motion/reactor.rb +7 -2
- data/motion/reactor/eventable.rb +14 -4
- data/motion/reactor/periodic_timer.rb +9 -3
- data/motion/ui/ui_bar_button_item.rb +99 -0
- data/motion/util/constants.rb +38 -0
- data/resources/test.mp3 +0 -0
- data/samples/camera/Gemfile +1 -1
- data/samples/camera/app/app_delegate.rb +1 -1
- data/samples/camera/app/controllers/camera_controller.rb +32 -47
- data/spec/motion/core/app_spec.rb +24 -0
- data/spec/motion/core/ui_bar_button_item_spec.rb +454 -0
- data/spec/motion/font/font_spec.rb +54 -0
- data/spec/motion/http_spec.rb +83 -9
- data/spec/motion/location/location_spec.rb +22 -1
- data/spec/motion/reactor/eventable_spec.rb +15 -0
- data/spec/motion/reactor_spec.rb +32 -0
- data/spec/motion/util/constants_spec.rb +26 -0
- metadata +24 -18
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OWEyMmJlN2FlMjdkMmQyZDRjNjVlZmVhMGJhZGVlNjUzODYyODg5MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MTYxYTA5NTgyMWExMTk5NDIwNGY4MGEyNWVkNzFiYjViNGFmNzZhZg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MjFiMzNlOTdhOWY4YzVjYTg1NzM5MjlhOTQzNjVhNjhkMWJmYzY3N2M3Yzkw
|
10
|
+
N2M0YzZiM2U2NGFhOTYyOWE0MmNkNTJiYzRiNjQ2ODZiOGYzNmEwNDM2MTAz
|
11
|
+
YTYxZDM5ZWJlNzIyNjY2N2ExYTU2MjBhODgwZWM4ZDQxZDhkMjE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MjhlNDQ5YWU0MGRkODQ1Zjc3YmIyZGU4YmYyOGIzOTUyNmI1MmViZDI3NWUw
|
14
|
+
ZGUzM2Y3MzNkMTcyZGY3ZWYzNzkwMzdkNWVkOTg0Y2IyM2UwMzMxMGU2YzMy
|
15
|
+
ZTkzZjgwYzZkY2U1NGFlYTcwODI0ZTk0YTk1MDY4MTM4YWY0Y2M=
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
-
|
3
|
+
## 1.2.0.pre
|
4
|
+
|
5
|
+
[Commit history](https://github.com/rubymotion/BubbleWrap/compare/v1.2...master)
|
6
|
+
|
7
|
+
* Added `BW::UIBarButtonItem`, a factory-esque wrapper for `UIBarButtonItem` ([#202](https://github.com/rubymotion/BubbleWrap/pull/202))
|
8
|
+
* Added `BW::Font`, a wrapper for creating `UIFont` objects ([#206](https://github.com/rubymotion/BubbleWrap/pull/206))
|
9
|
+
* Added `BW::Reactor::Eventable#off`, to remove `BW::Reactor` callbacks ([#205](https://github.com/rubymotion/BubbleWrap/pull/205))
|
10
|
+
* Added `BW::Constants.get`, which is a class to help wrapper creation ([#203](https://github.com/rubymotion/BubbleWrap/pull/203))
|
11
|
+
* Added `BW::Location.get_once` to grab only one location ([#197](https://github.com/rubymotion/BubbleWrap/pull/197))
|
12
|
+
* Added `App#environment`, to detect the current RubyMotion environment ([#191](https://github.com/rubymotion/BubbleWrap/pull/191))
|
13
|
+
* Added `:follow_urls` option to `BW::HTTP` ([#192](https://github.com/rubymotion/BubbleWrap/pull/192))
|
14
|
+
* Added `:common_modes` option to `BW::Reactor`to change the runloop mode (#190)
|
15
|
+
* Added `:no_redirect` option to `BW::HTTP` ([#187](https://github.com/rubymotion/BubbleWrap/pull/187))
|
16
|
+
* Added `:cookies` option to `BW::HTTP` ([#204](https://github.com/rubymotion/BubbleWrap/pull/204))
|
17
|
+
|
18
|
+
## 1.1.5
|
19
|
+
|
20
|
+
[Commit history](https://github.com/rubymotion/BubbleWrap/compare/v1.1.4...v1.1.5)
|
21
|
+
|
22
|
+
* Fix `BW::Camera` view-controller selection process to pickup a window's `presentedViewController` ([#183](https://github.com/rubymotion/BubbleWrap/pull/183))
|
23
|
+
* Fix strings parsed in `BW::JSON` to be mutable ([#175](https://github.com/rubymotion/BubbleWrap/pull/175))
|
24
|
+
* Add option for `:credential_persistence`/`NSURLCredentialPersistence` in `BW::HTTP` ([#166](https://github.com/rubymotion/BubbleWrap/pull/166))
|
25
|
+
* Change `Device.wide_screen?` to `Device.long_screen?` ([#159](https://github.com/rubymotion/BubbleWrap/pull/159))
|
26
|
+
* String escaping fixes to `BW::HTTP` ([#160](https://github.com/rubymotion/BubbleWrap/pull/160) [#161](https://github.com/rubymotion/BubbleWrap/pull/161) [#162](https://github.com/rubymotion/BubbleWrap/pull/162))
|
27
|
+
* Add `Device.sdk_version`
|
4
28
|
|
5
29
|
## 1.1.4
|
6
30
|
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -5,6 +5,10 @@ A collection of (tested) helpers and wrappers used to wrap CocoaTouch code and p
|
|
5
5
|
[BubbleWrap website](http://bubblewrap.io)
|
6
6
|
[BubbleWrap mailing list](https://groups.google.com/forum/#!forum/bubblewrap)
|
7
7
|
|
8
|
+
[](https://codeclimate.com/github/rubymotion/BubbleWrap)
|
9
|
+
[](https://travis-ci.org/rubymotion/BubbleWrap)
|
10
|
+
[](https://gemnasium.com/rubymotion/BubbleWrap)
|
11
|
+
|
8
12
|
## Installation
|
9
13
|
|
10
14
|
```ruby
|
@@ -159,6 +163,8 @@ A module with useful methods related to the running application
|
|
159
163
|
# ['NBC', 'ABC', 'Fox', 'CBS', 'PBS']
|
160
164
|
> App::Persistence['channels'] = ['TF1', 'France 2', 'France 3']
|
161
165
|
# ['TF1', 'France 2', 'France 3']
|
166
|
+
> App.environment
|
167
|
+
# 'test'
|
162
168
|
```
|
163
169
|
|
164
170
|
Other available methods:
|
@@ -171,6 +177,9 @@ Other available methods:
|
|
171
177
|
* `App.shared`
|
172
178
|
* `App.window`
|
173
179
|
* `App.current_locale`
|
180
|
+
* `App.release?`
|
181
|
+
* `App.test?`
|
182
|
+
* `App.development?`
|
174
183
|
|
175
184
|
|
176
185
|
### Device
|
@@ -285,6 +294,8 @@ simple interface:
|
|
285
294
|
# ['NBC', 'ABC', 'Fox', 'CBS', 'PBS']
|
286
295
|
> App::Persistence['channels'] = ['TF1', 'France 2', 'France 3']
|
287
296
|
# ['TF1', 'France 2', 'France 3']
|
297
|
+
> App::Persistence['something__new'] # something previously never stored
|
298
|
+
# nil
|
288
299
|
```
|
289
300
|
|
290
301
|
### Observers
|
@@ -400,6 +411,109 @@ button.when(UIControlEventTouchUpInside) do
|
|
400
411
|
end
|
401
412
|
```
|
402
413
|
|
414
|
+
### UIBarButtonItem
|
415
|
+
|
416
|
+
`BW::UIBarButtonItem` provides an idiomatic Ruby syntax for instantiating `UIBarButtonItem` objects. Instead of a target-action pair, each method accepts a block. When the button is tapped, the block is executed. As a convenience, the block is optional.
|
417
|
+
|
418
|
+
```ruby
|
419
|
+
BW::UIBarButtonItem.system(:save) do
|
420
|
+
# ...
|
421
|
+
end
|
422
|
+
|
423
|
+
title = "Friends"
|
424
|
+
BW::UIBarButtonItem.styled(:plain, title) do
|
425
|
+
# ...
|
426
|
+
end
|
427
|
+
|
428
|
+
image = UIImage.alloc.init
|
429
|
+
BW::UIBarButtonItem.styled(:bordered, image) do
|
430
|
+
# ...
|
431
|
+
end
|
432
|
+
|
433
|
+
image = UIImage.alloc.init
|
434
|
+
landscape = UIImage.alloc.init
|
435
|
+
BW::UIBarButtonItem.styled(:bordered, image, landscape) do
|
436
|
+
# ...
|
437
|
+
end
|
438
|
+
|
439
|
+
view = UIView.alloc.init
|
440
|
+
BW::UIBarButtonItem.custom(view) do
|
441
|
+
# ...
|
442
|
+
end
|
443
|
+
# NOTE: The block is attached to the view as a single tap gesture recognizer.
|
444
|
+
```
|
445
|
+
|
446
|
+
Alternatively, `BW::UIBarButtonItem` provides a flexible, builder-style syntax for dynamically instantiating `UIBarButtonItem` objects.
|
447
|
+
|
448
|
+
```ruby
|
449
|
+
options = { :system => :save }
|
450
|
+
BW::UIBarButtonItem.build(options) do
|
451
|
+
# ...
|
452
|
+
end
|
453
|
+
|
454
|
+
options = { :styled => :plain, :title => "Friends" }
|
455
|
+
BW::UIBarButtonItem.build(options) do
|
456
|
+
# ...
|
457
|
+
end
|
458
|
+
|
459
|
+
options = { :styled => :bordered, :image => UIImage.alloc.init }
|
460
|
+
BW::UIBarButtonItem.build(options) do
|
461
|
+
# ...
|
462
|
+
end
|
463
|
+
|
464
|
+
options = {
|
465
|
+
:styled => :bordered,
|
466
|
+
:image => UIImage.alloc.init,
|
467
|
+
:landscape => UIImage.alloc.init
|
468
|
+
}
|
469
|
+
BW::UIBarButtonItem.build(options) do
|
470
|
+
# ...
|
471
|
+
end
|
472
|
+
|
473
|
+
options = { :custom => UIView.alloc.init }
|
474
|
+
BW::UIBarButtonItem.build(options) do
|
475
|
+
# ...
|
476
|
+
end
|
477
|
+
# NOTE: The block is attached to the view as a single tap gesture recognizer.
|
478
|
+
```
|
479
|
+
|
480
|
+
The `.styled` button types are:
|
481
|
+
|
482
|
+
```ruby
|
483
|
+
:plain
|
484
|
+
:bordered
|
485
|
+
:done
|
486
|
+
```
|
487
|
+
|
488
|
+
And the `.system` button types are:
|
489
|
+
|
490
|
+
```ruby
|
491
|
+
:done
|
492
|
+
:cancel
|
493
|
+
:edit
|
494
|
+
:save
|
495
|
+
:add
|
496
|
+
:flexible_space
|
497
|
+
:fixed_space
|
498
|
+
:compose
|
499
|
+
:reply
|
500
|
+
:action
|
501
|
+
:organize
|
502
|
+
:bookmarks
|
503
|
+
:search
|
504
|
+
:refresh
|
505
|
+
:stop
|
506
|
+
:camera
|
507
|
+
:trash
|
508
|
+
:play
|
509
|
+
:pause
|
510
|
+
:rewind
|
511
|
+
:fast_forward
|
512
|
+
:undo
|
513
|
+
:redo
|
514
|
+
:page_curl
|
515
|
+
```
|
516
|
+
|
403
517
|
## HTTP
|
404
518
|
|
405
519
|
`BW::HTTP` wraps `NSURLRequest`, `NSURLConnection` and friends to provide Ruby developers with a more familiar and easier to use API.
|
@@ -480,7 +594,7 @@ state callbacks:
|
|
480
594
|
```ruby
|
481
595
|
feed_parser = BW::RSSParser.new("http://feeds.feedburner.com/sdrbpodcast")
|
482
596
|
feed_parser.delegate = self
|
483
|
-
|
597
|
+
feed_parser.parse do |item|
|
484
598
|
p item.title
|
485
599
|
end
|
486
600
|
|
@@ -658,15 +772,22 @@ idiom it is available as a public API.
|
|
658
772
|
|
659
773
|
```ruby
|
660
774
|
> o = Class.new { include EM::Eventable }.new
|
661
|
-
=> #<#<Class:
|
775
|
+
=> #<#<Class:0xab63f00>:0xab64430>
|
662
776
|
> o.on(:november_5_1955) { puts "Ow!" }
|
663
|
-
=> [#<Proc:
|
664
|
-
>
|
665
|
-
=>
|
777
|
+
=> [#<Proc:0xad9bf00>]
|
778
|
+
> flux = proc{ puts "Flux capacitor!" }
|
779
|
+
=> #<Proc:0xab630f0>
|
780
|
+
> o.on(:november_5_1955, &flux)
|
781
|
+
=> [#<Proc:0xad9bf00>, #<Proc:0xab630f0>]
|
666
782
|
> o.trigger(:november_5_1955)
|
667
783
|
Ow!
|
668
784
|
Flux capacitor!
|
669
785
|
=> [nil, nil]
|
786
|
+
> o.off(:november_5_1955, &flux)
|
787
|
+
=> #<Proc:0xab630f0>
|
788
|
+
> o.trigger(:november_5_1955)
|
789
|
+
Ow!
|
790
|
+
=> [nil]
|
670
791
|
```
|
671
792
|
|
672
793
|
# Suggestions?
|
data/lib/bubble-wrap/all.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
require File.expand_path('../loader', __FILE__)
|
2
|
-
['core', 'http', 'reactor', 'rss_parser', 'ui', 'location', 'media'].each { |sub|
|
2
|
+
['core', 'http', 'reactor', 'rss_parser', 'ui', 'location', 'media', 'font'].each { |sub|
|
3
3
|
require File.expand_path("../#{sub}", __FILE__)
|
4
4
|
}
|
data/lib/bubble-wrap/camera.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'bubble-wrap/loader'
|
2
|
+
BubbleWrap.require('motion/util/constants.rb')
|
2
3
|
BubbleWrap.require('motion/core/device.rb')
|
3
4
|
BubbleWrap.require('motion/core/device/**/*.rb') do
|
4
5
|
file('motion/core/device/camera_wrapper.rb').depends_on 'motion/core/device/camera.rb'
|
5
|
-
file('motion/core/device/camera.rb').depends_on 'motion/core/device.rb'
|
6
|
+
file('motion/core/device/camera.rb').depends_on ['motion/core/device.rb', 'motion/util/constants.rb']
|
6
7
|
file('motion/core/device/screen.rb').depends_on 'motion/core/device.rb'
|
7
8
|
end
|
data/lib/bubble-wrap/core.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'bubble-wrap/loader'
|
2
2
|
BubbleWrap.require('motion/core.rb')
|
3
3
|
BubbleWrap.require('motion/core/**/*.rb') do
|
4
|
-
file('motion/core/device/camera.rb').depends_on 'motion/core/device.rb'
|
5
|
-
file('motion/core/device/screen.rb').depends_on 'motion/core/device.rb'
|
6
4
|
file('motion/core/pollute.rb').depends_on 'motion/core/ns_index_path.rb'
|
7
5
|
end
|
6
|
+
require 'bubble-wrap/camera'
|
8
7
|
require 'bubble-wrap/ui'
|
data/lib/bubble-wrap/location.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'bubble-wrap/loader'
|
2
|
+
BubbleWrap.require('motion/util/constants.rb')
|
2
3
|
BubbleWrap.require('motion/core/string.rb')
|
3
4
|
BubbleWrap.require('motion/location/**/*.rb') do
|
4
5
|
file('motion/location/pollute.rb').depends_on 'motion/location/location.rb'
|
6
|
+
file('motion/location/location.rb').depends_on 'motion/util/constants.rb'
|
5
7
|
file('motion/location/location.rb').uses_framework('CoreLocation')
|
6
8
|
end
|
data/lib/bubble-wrap/version.rb
CHANGED
data/motion/core/app.rb
CHANGED
@@ -129,6 +129,23 @@ module BubbleWrap
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
+
# the current application environment : development, test, release
|
133
|
+
def environment
|
134
|
+
RUBYMOTION_ENV
|
135
|
+
end
|
136
|
+
|
137
|
+
def development?
|
138
|
+
environment == 'development'
|
139
|
+
end
|
140
|
+
|
141
|
+
def test?
|
142
|
+
environment == 'test'
|
143
|
+
end
|
144
|
+
|
145
|
+
def release?
|
146
|
+
environment == 'release'
|
147
|
+
end
|
148
|
+
|
132
149
|
end
|
133
150
|
end
|
134
151
|
::App = BubbleWrap::App unless defined?(::App)
|
@@ -12,6 +12,9 @@ module BubbleWrap
|
|
12
12
|
CANCELED=1000
|
13
13
|
end
|
14
14
|
|
15
|
+
Constants.register UIImagePickerControllerSourceTypePhotoLibrary, UIImagePickerControllerSourceTypeCamera,
|
16
|
+
UIImagePickerControllerSourceTypeSavedPhotosAlbum
|
17
|
+
|
15
18
|
MEDIA_TYPE_HASH = {movie: KUTTypeMovie, image: KUTTypeImage}
|
16
19
|
|
17
20
|
# The camera location; if :none, then we can't use source_type: :camera
|
@@ -88,7 +91,7 @@ module BubbleWrap
|
|
88
91
|
end
|
89
92
|
|
90
93
|
source_type_readable = options[:source_type]
|
91
|
-
source_type =
|
94
|
+
source_type = Constants.get("UIImagePickerControllerSourceType", @options[:source_type])
|
92
95
|
if not Camera.source_type_available?(source_type)
|
93
96
|
error(Error::SOURCE_TYPE_NOT_AVAILABLE) and return
|
94
97
|
end
|
@@ -176,7 +179,7 @@ module BubbleWrap
|
|
176
179
|
|
177
180
|
private
|
178
181
|
def camera_device
|
179
|
-
|
182
|
+
Constants.get("UIImagePickerControllerCameraDevice", self.location)
|
180
183
|
end
|
181
184
|
|
182
185
|
# ex media_type_to_symbol(KUTTypeMovie) => :movie
|
@@ -192,29 +195,6 @@ module BubbleWrap
|
|
192
195
|
def error(type)
|
193
196
|
@callback.call({ error: type })
|
194
197
|
end
|
195
|
-
|
196
|
-
# @param [String] base of the constant
|
197
|
-
# @param [Integer, String, Symbol] the
|
198
|
-
# @return [Integer] the constant for this base
|
199
|
-
# Examples
|
200
|
-
# const_int_get("UIReturnKey", :done) => UIReturnKeyDone == 9
|
201
|
-
# const_int_get("UIReturnKey", "done") => UIReturnKeyDone == 9
|
202
|
-
# const_int_get("UIReturnKey", 9) => 9
|
203
|
-
def const_int_get(base, value)
|
204
|
-
return value if value.is_a? Numeric
|
205
|
-
value = value.to_s.camelize
|
206
|
-
Kernel.const_get("#{base}#{value}")
|
207
|
-
end
|
208
|
-
|
209
|
-
# Looks like RubyMotion adds UIKit constants
|
210
|
-
# at compile time. If you don't use these
|
211
|
-
# directly in your code, they don't get added
|
212
|
-
# to Kernel and const_int_get crashes.
|
213
|
-
def load_constants_hack
|
214
|
-
[UIImagePickerControllerSourceTypePhotoLibrary, UIImagePickerControllerSourceTypeCamera,
|
215
|
-
UIImagePickerControllerSourceTypeSavedPhotosAlbum
|
216
|
-
]
|
217
|
-
end
|
218
198
|
end
|
219
199
|
end
|
220
200
|
end
|
data/motion/font/font.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
module BubbleWrap
|
2
|
+
module Font
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def bold(size = nil)
|
6
|
+
Font.new(:bold, size)
|
7
|
+
end
|
8
|
+
|
9
|
+
def system(size = nil)
|
10
|
+
Font.new(:system, size)
|
11
|
+
end
|
12
|
+
|
13
|
+
def italic(size = nil)
|
14
|
+
Font.new(:italic, size)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Example
|
18
|
+
# Font.new(<# UIFont >)
|
19
|
+
# Font.new("Helvetica")
|
20
|
+
# Font.new("Helvetica", 12)
|
21
|
+
# Font.new("Helvetica", size: 12)
|
22
|
+
# Font.new(name: "Helvetica", size: 12)
|
23
|
+
def new(params = {}, *args)
|
24
|
+
if params.is_a?(UIFont)
|
25
|
+
return params
|
26
|
+
end
|
27
|
+
_font = nil
|
28
|
+
|
29
|
+
if params.is_a?(NSString)
|
30
|
+
params = {name: params}
|
31
|
+
end
|
32
|
+
|
33
|
+
if args && !args.empty?
|
34
|
+
case args[0]
|
35
|
+
when NSDictionary
|
36
|
+
params.merge!(args[0])
|
37
|
+
else
|
38
|
+
params.merge!({size: args[0]})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
params[:size] ||= UIFont.systemFontSize
|
42
|
+
|
43
|
+
case params[:name].to_sym
|
44
|
+
when :system
|
45
|
+
_font = UIFont.systemFontOfSize(params[:size].to_f)
|
46
|
+
when :bold
|
47
|
+
_font = UIFont.boldSystemFontOfSize(params[:size].to_f)
|
48
|
+
when :italic
|
49
|
+
_font = UIFont.italicSystemFontOfSize(params[:size].to_f)
|
50
|
+
else
|
51
|
+
begin
|
52
|
+
_font = UIFont.fontWithName(params[:name], size: params[:size])
|
53
|
+
rescue
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if !_font
|
58
|
+
raise "Invalid font for parameters: #{params.inspect} args #{args.inspect}"
|
59
|
+
end
|
60
|
+
|
61
|
+
_font
|
62
|
+
end
|
63
|
+
|
64
|
+
class << self
|
65
|
+
alias_method :named, :new
|
66
|
+
end
|
67
|
+
|
68
|
+
# I.e. for UINavigationBar#titleTextAttributes
|
69
|
+
def attributes(params = {})
|
70
|
+
_attributes = {}
|
71
|
+
|
72
|
+
_attributes[UITextAttributeFont] = Font.new(params[:font]) if params[:font]
|
73
|
+
_attributes[UITextAttributeTextColor] = params[:color].to_color if params[:color]
|
74
|
+
_attributes[UITextAttributeTextShadowColor] = params[:shadow_color].to_color if params[:shadow_color]
|
75
|
+
_attributes[UITextAttributeTextShadowOffset] = begin
|
76
|
+
x = params[:shadow_offset][:x]
|
77
|
+
y = params[:shadow_offset][:y]
|
78
|
+
offset = UIOffsetMake(x,y)
|
79
|
+
NSValue.valueWithUIOffset(offset)
|
80
|
+
end if params[:shadow_offset]
|
81
|
+
|
82
|
+
_attributes
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|