sugarcube 0.12 → 0.13
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.
- data/README.md +50 -6
- data/lib/sugarcube/uiactionsheet.rb +55 -26
- data/lib/sugarcube/uicolor.rb +4 -0
- data/lib/sugarcube/uiview.rb +23 -1
- data/lib/sugarcube/version.rb +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -416,6 +416,9 @@ image.rotate(:right)
|
|
416
416
|
image.rotate(:flip) # 180° - if you have a better name, let me know!
|
417
417
|
image.rotate(45.degrees)
|
418
418
|
|
419
|
+
image.scale_to(new_size) # won't stretch
|
420
|
+
image.in_rect(frame) # stretches
|
421
|
+
|
419
422
|
# default insets are UIEdgeInsetsZero
|
420
423
|
image.tileable
|
421
424
|
image.tileable(insets)
|
@@ -423,7 +426,7 @@ image.stretchable
|
|
423
426
|
image.stretchable(insets)
|
424
427
|
```
|
425
428
|
|
426
|
-
|
429
|
+
UIAlertView
|
427
430
|
--------
|
428
431
|
|
429
432
|
Accepts multiple buttons and success and cancel handlers. In its simplest
|
@@ -447,6 +450,36 @@ UIAlertView.alert "I mean, is this cool?", buttons: %w[No! Sure! Hmmmm],
|
|
447
450
|
success: proc { |pressed| self.proceed if pressed == "Sure!" }
|
448
451
|
```
|
449
452
|
|
453
|
+
UIActionSheet
|
454
|
+
--------
|
455
|
+
|
456
|
+
This is very similar to `UIAlertView.alert`, but instead of `cancel` and
|
457
|
+
`success` handlers, you can have `cancel, success, and destructive` handlers,
|
458
|
+
and there is no `message` argument.
|
459
|
+
|
460
|
+
If you use an array of buttons (which you probably *should*), the order of
|
461
|
+
arguments is `[:cancel, :destructive, :others, ...]`. If you *dont* want a
|
462
|
+
cancel or destructive button, pass `nil` in place.
|
463
|
+
|
464
|
+
```ruby
|
465
|
+
# simple
|
466
|
+
UIActionSheet.alert 'This is happening, OK?' { self.happened! }
|
467
|
+
# a little more complex, with cancel and destructive buttons
|
468
|
+
UIActionSheet.alert('This is happening, OK?', buttons: ['Sure!', 'OK']
|
469
|
+
) {
|
470
|
+
self.happened!
|
471
|
+
}
|
472
|
+
|
473
|
+
UIActionSheet.alert('Should I?', buttons: [nil, nil, 'OK', 'Nevermind']) { |pressed|
|
474
|
+
self.do_it if pressed == 'OK'
|
475
|
+
}
|
476
|
+
|
477
|
+
UIActionSheet.alert 'I mean, is this cool?', buttons: ['Nah', 'With fire!', 'Sure', 'whatever'],
|
478
|
+
cancel: proc { self.cancel },
|
479
|
+
destructive: proc { self.kill_it_with_fire }
|
480
|
+
success: proc { |pressed| self.proceed if pressed == 'Sure' }
|
481
|
+
```
|
482
|
+
|
450
483
|
UIView
|
451
484
|
--------
|
452
485
|
|
@@ -773,11 +806,12 @@ test[:my] = 'new'
|
|
773
806
|
|
774
807
|
Instead, just use the coercion methods `Rect()`, `Size()` and `Point()`. They
|
775
808
|
will happily convert most sensible (and some non-sensible) arguments into a
|
776
|
-
`CGRect/CGSize/CGPoint` struct.
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
809
|
+
`CGRect/CGSize/CGPoint` struct.
|
810
|
+
|
811
|
+
For more CoreGraphics additions, you should use [geomotion][] by [Clay
|
812
|
+
Allsopp][]. It adds methods to `CGRect`, `CGPoint`, and `CGSize` to make these
|
813
|
+
structures more rubyesque (these methods used to be part of SugarCube, but were
|
814
|
+
removed in an attempt to decrease the amount of duplicated code).
|
781
815
|
|
782
816
|
[geomotion]: https://github.com/clayallsopp
|
783
817
|
[Clay Allsopp]: https://github.com/clayallsopp/geomotion
|
@@ -1020,6 +1054,16 @@ You can analyze `UIViewController` hierarchies, too. There's even a handy
|
|
1020
1054
|
=> #<MainScreenController:0xac23b80>
|
1021
1055
|
```
|
1022
1056
|
|
1057
|
+
##### Nothing is sacred
|
1058
|
+
|
1059
|
+
The adjust and tree methods act on global objects. Once either of these methods
|
1060
|
+
is used, you can access that global if you want:
|
1061
|
+
|
1062
|
+
```ruby
|
1063
|
+
$sugarcube_view # => the view (or any object) being 'adjusted' (accessible using `adjust` or `a`)
|
1064
|
+
$sugarcube_items # => the list of views that was output using `tree`
|
1065
|
+
```
|
1066
|
+
|
1023
1067
|
|
1024
1068
|
Pointers
|
1025
1069
|
----------
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class UIActionSheet
|
2
2
|
|
3
|
-
# UIActionSheet.alert("
|
3
|
+
# UIActionSheet.alert("title",
|
4
4
|
# # The first button is considered the 'cancel' button, for the purposes of
|
5
5
|
# # whether the cancel or success handler gets called, the second button is
|
6
6
|
# # the 'destructive' button, and the rest are plain old buttons.
|
@@ -10,49 +10,78 @@ class UIActionSheet
|
|
10
10
|
# success: proc{ |pressed| puts "pressed: #{pressed}" },
|
11
11
|
# )
|
12
12
|
def self.alert(title, options={}, &block)
|
13
|
-
if options.is_a? String
|
14
|
-
options = {message: options}
|
15
|
-
end
|
16
|
-
|
17
13
|
# create the delegate
|
18
14
|
delegate = SugarCube::ActionSheetDelegate.new
|
19
15
|
delegate.on_success = options[:success] || block
|
20
|
-
delegate.on_destructive = options[:destructive]
|
16
|
+
delegate.on_destructive = options[:destructive]
|
21
17
|
delegate.on_cancel = options[:cancel]
|
22
18
|
delegate.send(:retain)
|
23
19
|
|
24
20
|
args = [title] # initWithTitle:
|
25
|
-
args << options[:message] # message:
|
26
21
|
args << delegate # delegate:
|
27
22
|
|
28
|
-
buttons =
|
23
|
+
buttons = []
|
24
|
+
buttons.concat(options[:buttons]) if options[:buttons]
|
25
|
+
|
29
26
|
if buttons.empty?
|
30
|
-
# cancelButtonTitle: is first, so check for cancel
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
elsif buttons.length == 1 and options[:cancel]
|
37
|
-
raise "If you only have one button, use a :success handler, not :cancel (and definitely not BOTH)"
|
38
|
-
end
|
27
|
+
# cancelButtonTitle: is first, so check for cancel handler
|
28
|
+
if options[:cancel]
|
29
|
+
buttons << 'Cancel'
|
30
|
+
else
|
31
|
+
buttons << nil
|
32
|
+
end
|
39
33
|
|
40
|
-
|
41
|
-
|
34
|
+
# destructiveButtonTitle, check for destructive handler
|
35
|
+
if options[:destructive]
|
36
|
+
buttons << 'Delete'
|
37
|
+
else
|
38
|
+
buttons << nil
|
39
|
+
end
|
40
|
+
elsif buttons.length == 1 and (options[:cancel] or options[:destructive])
|
41
|
+
raise 'If you only have one button, use a :success handler, not :cancel or :destructive'
|
42
|
+
end
|
42
43
|
|
43
44
|
# uses localized buttons in the actual alert
|
44
|
-
|
45
|
+
if buttons.length == 0
|
46
|
+
buttons = [nil, nil]
|
47
|
+
elsif buttons.length == 1
|
48
|
+
buttons << nil
|
49
|
+
end
|
50
|
+
|
51
|
+
last_index = buttons.length - 1
|
52
|
+
offset = 0
|
53
|
+
|
54
|
+
button_index_map = {}
|
55
|
+
if buttons[1] # destructive
|
56
|
+
button_index_map[0] = buttons[1]
|
57
|
+
offset += 1
|
58
|
+
else
|
59
|
+
last_index -= 1
|
60
|
+
end
|
61
|
+
|
62
|
+
if buttons[0] # cancel
|
63
|
+
button_index_map[last_index] = buttons[0]
|
64
|
+
end
|
65
|
+
|
66
|
+
buttons[2..-1].each_with_index { |button, index|
|
67
|
+
button_index_map[index + offset] = button
|
68
|
+
}
|
69
|
+
# the button titles, mapped to how UIActionSheet orders them. These are passed to the success handler.
|
70
|
+
delegate.button_index_map = button_index_map
|
71
|
+
|
72
|
+
args.concat(buttons.map{ |s| s ? s.localized : nil })
|
45
73
|
args << nil # otherButtonTitles:..., nil
|
46
74
|
|
47
75
|
alert = self.alloc
|
48
|
-
alert.send('initWithTitle:
|
49
|
-
|
76
|
+
alert.send('initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:', *args)
|
77
|
+
window = UIApplication.sharedApplication.keyWindow || UIApplication.sharedApplication.windows[0]
|
78
|
+
alert.showInView(window)
|
50
79
|
alert
|
51
80
|
end
|
52
81
|
|
53
82
|
private
|
54
83
|
def dummy
|
55
|
-
self.initWithTitle(nil,
|
84
|
+
self.initWithTitle(nil, delegate:nil, cancelButtonTitle:nil, destructiveButtonTitle:nil, otherButtonTitles:nil)
|
56
85
|
end
|
57
86
|
|
58
87
|
end
|
@@ -60,12 +89,12 @@ end
|
|
60
89
|
|
61
90
|
module SugarCube
|
62
91
|
class ActionSheetDelegate
|
63
|
-
attr_accessor :
|
92
|
+
attr_accessor :button_index_map
|
64
93
|
attr_accessor :on_cancel
|
65
94
|
attr_accessor :on_destructive
|
66
95
|
attr_accessor :on_success
|
67
96
|
|
68
|
-
def
|
97
|
+
def actionSheet(alert, didDismissWithButtonIndex:index)
|
69
98
|
if index == alert.destructiveButtonIndex && on_destructive
|
70
99
|
on_destructive.call
|
71
100
|
elsif index == alert.cancelButtonIndex && on_cancel
|
@@ -74,7 +103,7 @@ module SugarCube
|
|
74
103
|
if on_success.arity == 0
|
75
104
|
on_success.call
|
76
105
|
else
|
77
|
-
button =
|
106
|
+
button = button_index_map[index]
|
78
107
|
on_success.call(button)
|
79
108
|
end
|
80
109
|
end
|
data/lib/sugarcube/uicolor.rb
CHANGED
data/lib/sugarcube/uiview.rb
CHANGED
@@ -35,8 +35,15 @@ class UIView
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
# superview << view
|
39
|
+
# => superview.addSubview(view)
|
38
40
|
def <<(view)
|
39
|
-
self.addSubview
|
41
|
+
self.addSubview(view)
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
|
45
|
+
def unshift(view)
|
46
|
+
self.insertSubview(view, atIndex:0)
|
40
47
|
return self
|
41
48
|
end
|
42
49
|
|
@@ -139,6 +146,21 @@ class UIView
|
|
139
146
|
fade(options, &after)
|
140
147
|
end
|
141
148
|
|
149
|
+
# Changes the layer opacity to 0 and then removes the view from its superview
|
150
|
+
# @see #fade_out
|
151
|
+
def fade_out_and_remove(options={}, &after)
|
152
|
+
if options.is_a? Numeric
|
153
|
+
options = { duration: options }
|
154
|
+
end
|
155
|
+
|
156
|
+
after_remove = proc {
|
157
|
+
removeFromSuperview
|
158
|
+
after.call if after
|
159
|
+
}
|
160
|
+
|
161
|
+
fade_out(options, &after_remove)
|
162
|
+
end
|
163
|
+
|
142
164
|
def move_to(position, options={}, &after)
|
143
165
|
if options.is_a? Numeric
|
144
166
|
options = { duration: options }
|
data/lib/sugarcube/version.rb
CHANGED