sugarcube 0.5 → 0.6
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 +132 -36
- data/lib/sugarcube/adjust.rb +2 -2
- data/lib/sugarcube/array.rb +11 -0
- data/lib/sugarcube/core_graphics.rb +358 -142
- data/lib/sugarcube/fixnum.rb +2 -2
- data/lib/sugarcube/to_s/nsset.rb +7 -0
- data/lib/sugarcube/to_s/uievent.rb +40 -0
- data/lib/sugarcube/to_s/uitouch.rb +20 -0
- data/lib/sugarcube/to_s/uiview.rb +8 -0
- data/lib/sugarcube/uialertview.rb +1 -1
- data/lib/sugarcube/uiview.rb +0 -6
- data/lib/sugarcube/version.rb +1 -1
- metadata +11 -6
data/README.md
CHANGED
@@ -173,8 +173,41 @@ self.view.show # => self.hidden = false
|
|
173
173
|
self.view.hide # => self.hidden = true
|
174
174
|
```
|
175
175
|
|
176
|
-
|
177
|
-
|
176
|
+
###### Animations
|
177
|
+
|
178
|
+
jQuery-like animation methods.
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
# default timeout is 0.3
|
182
|
+
view.fade_out { |view|
|
183
|
+
view.removeFromSuperview
|
184
|
+
}
|
185
|
+
# options:
|
186
|
+
view.fade_out(0.5, delay: 0,
|
187
|
+
options: UIViewAnimationOptionCurveLinear,
|
188
|
+
opacity: 0.5) { |view|
|
189
|
+
view.removeFromSuperview
|
190
|
+
}
|
191
|
+
|
192
|
+
view.move_to([0, 100]) # move to position 0, 100
|
193
|
+
view.delta_to([0, 100]) # move over 0, down 100, from current position
|
194
|
+
|
195
|
+
view.slide :left # slides the entire view one "page" to the left, right, up, or down
|
196
|
+
|
197
|
+
view.shake # shakes the view.
|
198
|
+
# options w/ default values:
|
199
|
+
shake offset: 8, # move 8 px left, and 8 px right
|
200
|
+
repeat: 3, # three times
|
201
|
+
duration: 0.3, # for a total of 0.3 seconds
|
202
|
+
keypath: 'transform.translate.x'
|
203
|
+
|
204
|
+
# vigorous nodding - modifying transform.translation.y:
|
205
|
+
view.shake offset: 20, repeat: 10, duration: 5, keypath: 'transform.translation.y'
|
206
|
+
# an adorable wiggle - modifying transform.rotation:
|
207
|
+
superview.shake offset: 0.1, repeat: 2, duration: 0.5, keypath: 'transform.rotation'
|
208
|
+
```
|
209
|
+
|
210
|
+
###### View factories
|
178
211
|
|
179
212
|
```ruby
|
180
213
|
UIButton.buttonWithType(:custom.uibuttontype)
|
@@ -303,61 +336,109 @@ test[:my] = 'new'
|
|
303
336
|
|
304
337
|
###### Is it `CGMakeRect` or `CGRectMake`?
|
305
338
|
|
306
|
-
Instead, just use `Rect`, `Size` and `Point`.
|
307
|
-
`
|
308
|
-
|
339
|
+
Instead, just use `Rect`, `Size` and `Point`. They will happily convert most
|
340
|
+
sensible arguments into a `Rect/Size/Point`, which can be treated as a `CGRect`
|
341
|
+
object OR as an `Array` (woah).
|
342
|
+
|
343
|
+
These are namespaced in `SugarCube::CoreGraphics` module, but I recommend you
|
344
|
+
`include SugarCube::CoreGraphics` in app_delegate.rb.
|
309
345
|
|
310
346
|
```ruby
|
311
|
-
f = Rect(view.frame) # converts a CGRect into a
|
312
|
-
o = Point(view.frame.origin) # converts a CGPoint into a
|
313
|
-
s = Size(view.frame.size) # converts a CGSize into a
|
347
|
+
f = Rect(view.frame) # converts a CGRect into a Rect
|
348
|
+
o = Point(view.frame.origin) # converts a CGPoint into a Point
|
349
|
+
s = Size(view.frame.size) # converts a CGSize into a Size
|
314
350
|
|
315
351
|
# lots of other conversions are possible.
|
352
|
+
# a UIView or CALayer => view.frame
|
353
|
+
f = Rect(view)
|
316
354
|
# 4 numbers
|
317
355
|
f = Rect(x, y, w, h)
|
318
356
|
# or two arrays
|
319
357
|
p = Point(x, y) # or just [x, y] works, too
|
320
358
|
s = Size(w, h) # again, [w, h] is fine
|
321
359
|
f = Rect(p, s)
|
322
|
-
|
323
|
-
|
324
|
-
view.frame = f # Rect returns a CGRectArray, which view.frame can accept
|
360
|
+
# like I said, a straight-up array of nested arrays is fine, too.
|
361
|
+
f = Rect([[x, y], [w, h]])
|
325
362
|
```
|
326
363
|
|
327
|
-
######
|
364
|
+
###### {CGRect,CGPoint,CGSize} is a *real boy*!
|
328
365
|
|
329
|
-
|
366
|
+
These methods get defined in a module (`SugarCube::CG{Rect,Size,Point}Extensions`),
|
367
|
+
and included in `CGRect` *and* `Rect`. The idea is that you do not have to
|
368
|
+
distinguish between the two objects.
|
369
|
+
|
370
|
+
These methods all use the methods as described in [CGGeometry Reference][], e.g.
|
371
|
+
`CGRectContainsPoint`, `CGRectIntersectsRect`, etc.
|
330
372
|
|
331
373
|
```ruby
|
332
|
-
#
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
374
|
+
# intersection / contains
|
375
|
+
Point(0, 0).intersects?(Rect(-1, -1, 2, 2)) # => true
|
376
|
+
# if a Point intersects a Rect, the Rect intersects the Point, right?
|
377
|
+
Rect(-1, -1, 2, 2).intersects? Point(0, 0) # => true
|
378
|
+
|
379
|
+
# CGRect and the gang are real Ruby objects. Let's treat 'em that way!
|
380
|
+
view.frame.contains? Point(10, 10) # in this case, contains? and intersects? are synonyms
|
381
|
+
view.frame.intersects? Rect(0, 0, 10, 10) # <= but this one
|
382
|
+
view.frame.contains? Rect(0, 0, 10, 10) # <= and this one are different.
|
383
|
+
|
384
|
+
# CGRect has factory methods for CGRectEmpty, CGRectNull, and - KINDA - CGRectInfinite
|
385
|
+
# BUT, there is a bug (?) right now where CGRectIsInfinite(CGRectInfinite) returns false.
|
386
|
+
# so instead, I've built my own infinite? method that checks for the special "Infinite" value
|
387
|
+
> CGRect.infinite
|
388
|
+
=> [[0, 0], [Infinity, Infinity]]
|
389
|
+
> CGRect.infinite.infinite?
|
390
|
+
=> true
|
391
|
+
> CGRect.null
|
392
|
+
=> [[Infinity, Infinity], [0.0, 0.0]]
|
393
|
+
> CGRect.null.null?
|
394
|
+
=> true
|
395
|
+
> CGRect.empty
|
396
|
+
=> [[0.0, 0.0], [0.0, 0.0]]
|
397
|
+
> CGRect.empty.empty?
|
398
|
+
=> true
|
399
|
+
```
|
342
400
|
|
343
|
-
|
344
|
-
view.delta_to([0, 100]) # move over 0, down 100, from current position
|
401
|
+
A lot of the methods in CGGeometry Reference are available as instance methods
|
345
402
|
|
346
|
-
|
403
|
+
```ruby
|
404
|
+
view.frame.left # => CGRectGetMinX(view.frame)
|
405
|
+
view.frame.right # => CGRectGetMaxX(view.frame)
|
406
|
+
view.frame.top # => CGRectGetMinY(view.frame)
|
407
|
+
view.frame.bottom # => CGRectGetMaxY(view.frame)
|
408
|
+
view.frame.width # => CGRectGetWidth(view.frame)
|
409
|
+
view.frame.height # => CGRectGetHeight(view.frame)
|
410
|
+
view.frame.center # => Point(CGRectGetMidX(view.frame), CGRectGetMidY(view.frame))
|
411
|
+
|
412
|
+
view.frame.intersection(another_rect) # => CGRectIntersection(view.frame, another_rect)
|
413
|
+
view.frame + another_rect # => CGRectUnion(view.frame, another_rect)
|
414
|
+
view.frame + a_point # => CGRectOffset(view.frame, a_point.x, a_point.y)
|
415
|
+
view.frame + a_offset # => CGRectOffset(view.frame, a_offset.horizontal, a_offset.vertical)
|
416
|
+
view.frame + edgeinsets # => UIEdgeInsetsInsetRect(view.frame, edgeinsets)
|
417
|
+
view.frame + a_size # => CGRectInset(view.frame, -a_size.width, -a_size.height)
|
418
|
+
# Adding a size to a view keeps the view's CENTER in the same place, but
|
419
|
+
# increases its size by `size.width,size.height`. it's the same as using
|
420
|
+
# UIEdgeInsets with top == bottom, and left == right
|
421
|
+
> Rect(0, 0, 10, 10).center
|
422
|
+
=> Point(5.0, 5.0) # note the center
|
423
|
+
> Rect(0, 0, 10, 10) + Size(10, 10)
|
424
|
+
=> Rect([-10.0, -10.0],{30.0 × 30.0}) # origin and size changed, but...
|
425
|
+
> (Rect(0, 0, 10, 10) + Size(10, 10)).center
|
426
|
+
=> Point(5.0, 5.0)
|
427
|
+
# See? It's bigger, but the center hasn't moved.
|
428
|
+
```
|
347
429
|
|
348
|
-
|
349
|
-
|
350
|
-
shake offset: 8, # move 8 px left, and 8 px right
|
351
|
-
repeat: 3, # three times
|
352
|
-
duration: 0.3, # for a total of 0.3 seconds
|
353
|
-
keypath: 'transform.translate.x'
|
430
|
+
`to_hash/from_hash`, and notice here that I used `puts`, to show that the `to_s`
|
431
|
+
method is a little more readable.
|
354
432
|
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
433
|
+
```ruby
|
434
|
+
> Rect(0, 0, 10, 10).to_hash
|
435
|
+
=> {"Width"=>10.0, "Height"=>10.0, "Y"=>0.0, "X"=>0.0}
|
436
|
+
> puts CGRect.from_hash Rect(0, 0, 1, 1).to_hash
|
437
|
+
CGRect([0.0, 0.0],{1.0 × 1.0})
|
359
438
|
```
|
360
439
|
|
440
|
+
[CGGeometry Reference]: https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGGeometry/Reference/reference.html
|
441
|
+
|
361
442
|
REPL View adjustments
|
362
443
|
-----------------------
|
363
444
|
|
@@ -413,6 +494,21 @@ Assume I ran `include SugarCube::Adjust` in these examples.
|
|
413
494
|
# if you forget what view you are adjusting, run `adjust` again
|
414
495
|
> a
|
415
496
|
=> {UITextField @ x: 46.0 y:214.0, 280.0×33.0} child of UIView
|
497
|
+
```
|
498
|
+
|
499
|
+
Pointers
|
500
|
+
----------
|
501
|
+
|
502
|
+
These are not UIKit-related, so I reverted to Ruby's preferred `to_foo`
|
503
|
+
convention.
|
504
|
+
|
505
|
+
```ruby
|
506
|
+
[0.0, 1.1, 2.2].to_pointer(:float)
|
507
|
+
|
508
|
+
floats = Pointer.new(:float, 3)
|
509
|
+
floats[0] = 0.0
|
510
|
+
floats[1] = 1.1
|
511
|
+
floats[2] = 2.2
|
416
512
|
```
|
417
513
|
|
418
514
|
[BubbleWrap]: https://github.com/rubymotion/BubbleWrap
|
data/lib/sugarcube/adjust.rb
CHANGED
@@ -1,190 +1,401 @@
|
|
1
|
+
module SugarCube
|
2
|
+
# Extensions to make CGRect a "real class"
|
3
|
+
module CGRectExtensions
|
4
|
+
module ClassMethods
|
1
5
|
|
2
|
-
|
6
|
+
def empty
|
7
|
+
SugarCube::CoreGraphics::Rect(CGRectZero)
|
8
|
+
end
|
3
9
|
|
4
|
-
|
5
|
-
|
6
|
-
super [CGPointArray.new([args[0], args[1]]), CGSizeArray.new([args[2], args[3]])]
|
7
|
-
else
|
8
|
-
unless CGPointArray === args[0]
|
9
|
-
args[0] = SugarCube::CoreGraphics::Point(args[0])
|
10
|
+
def null
|
11
|
+
SugarCube::CoreGraphics::Rect(CGRectNull)
|
10
12
|
end
|
11
|
-
|
12
|
-
|
13
|
+
|
14
|
+
def infinite
|
15
|
+
SugarCube::CoreGraphics::Rect([0, 0], CGSize.infinite)
|
16
|
+
end
|
17
|
+
|
18
|
+
def from_hash(hash)
|
19
|
+
ret = Pointer.new(CGRect.type)
|
20
|
+
if CGRectMakeWithDictionaryRepresentation(hash, ret)
|
21
|
+
ret[0]
|
22
|
+
else
|
23
|
+
nil
|
24
|
+
end
|
13
25
|
end
|
14
|
-
super [args[0], args[1]]
|
15
26
|
end
|
16
|
-
end
|
17
27
|
|
18
|
-
|
19
|
-
|
20
|
-
|
28
|
+
def self.included(base)
|
29
|
+
base.extend(ClassMethods)
|
30
|
+
end
|
21
31
|
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
def empty?
|
33
|
+
CGRectIsEmpty(self)
|
34
|
+
end
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
36
|
+
def infinite?
|
37
|
+
self.size.infinite?
|
38
|
+
end
|
29
39
|
|
30
|
-
|
31
|
-
|
32
|
-
|
40
|
+
def null?
|
41
|
+
CGRectIsNull(self)
|
42
|
+
end
|
33
43
|
|
34
|
-
|
35
|
-
|
36
|
-
def +(rect)
|
37
|
-
case rect
|
38
|
-
when CGRectArray
|
39
|
-
x1 = self.origin.x < rect.origin.x ? self.origin.x : rect.origin.x
|
40
|
-
y1 = self.origin.y < rect.origin.y ? self.origin.y : rect.origin.y
|
41
|
-
x2 = self.origin.x + self.size.width > rect.origin.x + rect.size.width ? self.origin.x + self.size.width : rect.origin.x + rect.size.width
|
42
|
-
y2 = self.origin.y + self.size.height > rect.origin.y + rect.size.height ? self.origin.y + self.size.height : rect.origin.y + rect.size.height
|
43
|
-
SugarCube::CoreGraphics::Rect(x1, y1, x2-x1, y2-y1)
|
44
|
-
when CGPointArray
|
45
|
-
x = self.origin.x + rect.x
|
46
|
-
y = self.origin.y + rect.y
|
47
|
-
SugarCube::CoreGraphics::Rect([[x, y], self.size])
|
48
|
-
when CGSizeArray
|
49
|
-
w = self.size.width + rect.width
|
50
|
-
h = self.size.height + rect.height
|
51
|
-
SugarCube::CoreGraphics::Rect([self.origin, [w, h]])
|
52
|
-
else
|
53
|
-
super
|
44
|
+
def left
|
45
|
+
return CGRectGetMinX(self)
|
54
46
|
end
|
55
|
-
end
|
56
47
|
|
57
|
-
|
48
|
+
def right
|
49
|
+
return CGRectGetMaxX(self)
|
50
|
+
end
|
58
51
|
|
52
|
+
def width
|
53
|
+
return CGRectGetWidth(self)
|
54
|
+
end
|
59
55
|
|
60
|
-
|
56
|
+
def top
|
57
|
+
return CGRectGetMinY(self)
|
58
|
+
end
|
61
59
|
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
def bottom
|
61
|
+
return CGRectGetMaxY(self)
|
62
|
+
end
|
65
63
|
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
def height
|
65
|
+
return CGRectGetHeight(self)
|
66
|
+
end
|
69
67
|
|
70
|
-
|
71
|
-
|
72
|
-
|
68
|
+
def center
|
69
|
+
return SugarCube::CoreGraphics::Point(CGRectGetMidX(self), CGRectGetMidY(self))
|
70
|
+
end
|
73
71
|
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
def to_s
|
73
|
+
"#{self.class.name}([#{self.origin.x}, #{self.origin.y}],{#{self.size.width} × #{self.size.height}})"
|
74
|
+
end
|
77
75
|
|
78
|
-
|
79
|
-
|
80
|
-
case point
|
81
|
-
when CGPointArray
|
82
|
-
x = self.x + point.x
|
83
|
-
y = self.y + point.y
|
84
|
-
CGPointArray[x, y]
|
85
|
-
when CGSizeArray
|
86
|
-
CGRectArray[self, point]
|
87
|
-
else
|
88
|
-
super
|
76
|
+
def to_hash
|
77
|
+
CGRectCreateDictionaryRepresentation(self)
|
89
78
|
end
|
90
|
-
end
|
91
79
|
|
92
|
-
end
|
80
|
+
def inspect ; to_s ; end
|
81
|
+
|
82
|
+
# # returns an intersection of self and rect, or moves the Rect using Point,
|
83
|
+
# or increases the size using Size
|
84
|
+
def +(rect)
|
85
|
+
case rect
|
86
|
+
when SugarCube::CoreGraphics::Rect, CGRect
|
87
|
+
SugarCube::CoreGraphics::Rect(CGRectUnion(self, rect))
|
88
|
+
when SugarCube::CoreGraphics::Point, CGPoint
|
89
|
+
SugarCube::CoreGraphics::Rect(CGRectOffset(self, rect.x, rect.y))
|
90
|
+
when SugarCube::CoreGraphics::Offset, UIOffset
|
91
|
+
SugarCube::CoreGraphics::Rect(CGRectOffset(self, rect.horizontal, rect.vertical))
|
92
|
+
when SugarCube::CoreGraphics::Size, CGSize
|
93
|
+
SugarCube::CoreGraphics::Rect(CGRectInset(self, - rect.width, - rect.height))
|
94
|
+
when SugarCube::CoreGraphics::EdgeInsets, UIEdgeInsets
|
95
|
+
SugarCube::CoreGraphics::Rect(UIEdgeInsetsInsetRect(self, rect))
|
96
|
+
else
|
97
|
+
super
|
98
|
+
end
|
99
|
+
end
|
93
100
|
|
94
|
-
|
101
|
+
def intersection(rect)
|
102
|
+
SugarCube::CoreGraphics::Rect(CGRectIntersection(self, rect))
|
103
|
+
end
|
95
104
|
|
96
|
-
|
97
|
-
|
98
|
-
|
105
|
+
def intersects?(rect_or_point)
|
106
|
+
case rect_or_point
|
107
|
+
when SugarCube::CoreGraphics::Point, CGPoint
|
108
|
+
CGRectContainsPoint(self, rect_or_point)
|
109
|
+
when Array, CGRect
|
110
|
+
CGRectIntersectsRect(self, rect_or_point)
|
111
|
+
else
|
112
|
+
super
|
113
|
+
end
|
114
|
+
end
|
99
115
|
|
100
|
-
|
101
|
-
|
102
|
-
|
116
|
+
def contains?(rect_or_point)
|
117
|
+
case rect_or_point
|
118
|
+
when SugarCube::CoreGraphics::Point, CGPoint
|
119
|
+
CGRectContainsPoint(self, rect_or_point)
|
120
|
+
when Array, CGRect
|
121
|
+
CGRectContainsRect(self, rect_or_point)
|
122
|
+
else
|
123
|
+
super
|
124
|
+
end
|
125
|
+
end
|
103
126
|
|
104
|
-
|
105
|
-
|
106
|
-
|
127
|
+
def ==(rect)
|
128
|
+
CGRectEqualToRect(self, rect)
|
129
|
+
end
|
107
130
|
|
108
|
-
def height= val
|
109
|
-
self[1] = val
|
110
131
|
end
|
111
132
|
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
133
|
+
# Extensions to make CGPoint a "real class"
|
134
|
+
module CGPointExtensions
|
135
|
+
module ClassMethods
|
136
|
+
def from_hash(hash)
|
137
|
+
ret = Pointer.new(CGPoint.type)
|
138
|
+
if CGPointMakeWithDictionaryRepresentation(hash, ret)
|
139
|
+
ret[0]
|
140
|
+
else
|
141
|
+
nil
|
142
|
+
end
|
143
|
+
end
|
123
144
|
end
|
124
|
-
end
|
125
145
|
|
126
|
-
|
146
|
+
def self.included(base)
|
147
|
+
base.extend(ClassMethods)
|
148
|
+
end
|
127
149
|
|
150
|
+
def intersects?(rect)
|
151
|
+
CGRectContainsPoint(rect, self)
|
152
|
+
end
|
128
153
|
|
129
|
-
|
154
|
+
def ==(point)
|
155
|
+
CGPointEqualToPoint(self, point)
|
156
|
+
end
|
130
157
|
|
131
|
-
|
132
|
-
|
133
|
-
|
158
|
+
def to_s
|
159
|
+
"#{self.class.name}(#{self.x}, #{self.y})"
|
160
|
+
end
|
134
161
|
|
135
|
-
|
136
|
-
|
137
|
-
|
162
|
+
def to_hash
|
163
|
+
CGPointCreateDictionaryRepresentation(self)
|
164
|
+
end
|
138
165
|
|
139
|
-
|
140
|
-
return self[1]
|
141
|
-
end
|
166
|
+
def inspect ; to_s ; end
|
142
167
|
|
143
|
-
def left= val
|
144
|
-
self[1] = val
|
145
168
|
end
|
146
169
|
|
147
|
-
|
148
|
-
|
149
|
-
|
170
|
+
# Extensions to make CGSize a "real class"
|
171
|
+
module CGSizeExtensions
|
172
|
+
module ClassMethods
|
173
|
+
def infinite
|
174
|
+
infinity = CGRect.null[0][0]
|
175
|
+
SugarCube::CoreGraphics::Size(infinity, infinity)
|
176
|
+
end
|
150
177
|
|
151
|
-
|
152
|
-
|
153
|
-
|
178
|
+
def from_hash(hash)
|
179
|
+
ret = Pointer.new(CGSize.type)
|
180
|
+
if CGSizeMakeWithDictionaryRepresentation(hash, ret)
|
181
|
+
ret[0]
|
182
|
+
else
|
183
|
+
nil
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
154
187
|
|
155
|
-
|
156
|
-
|
157
|
-
|
188
|
+
def self.included(base)
|
189
|
+
base.extend(ClassMethods)
|
190
|
+
end
|
158
191
|
|
159
|
-
|
160
|
-
|
161
|
-
|
192
|
+
def infinite?
|
193
|
+
infinity = CGRect.null[0][0]
|
194
|
+
self.width == infinity or self.height == infinity
|
195
|
+
end
|
162
196
|
|
163
|
-
|
197
|
+
def ==(size)
|
198
|
+
CGSizeEqualToSize(self, size)
|
199
|
+
end
|
200
|
+
|
201
|
+
def to_s
|
202
|
+
"#{self.class.name}(#{self.width} × #{self.height})"
|
203
|
+
end
|
164
204
|
|
205
|
+
def to_hash
|
206
|
+
CGSizeCreateDictionaryRepresentation(self)
|
207
|
+
end
|
165
208
|
|
166
|
-
|
209
|
+
def inspect ; to_s ; end
|
167
210
|
|
168
|
-
def horizontal
|
169
|
-
return self[0]
|
170
211
|
end
|
212
|
+
end
|
171
213
|
|
172
|
-
def horizontal= val
|
173
|
-
self[0] = val
|
174
|
-
end
|
175
214
|
|
176
|
-
|
177
|
-
|
178
|
-
|
215
|
+
class CGRect
|
216
|
+
include SugarCube::CGRectExtensions
|
217
|
+
end
|
218
|
+
|
219
|
+
|
220
|
+
class CGPoint
|
221
|
+
include SugarCube::CGPointExtensions
|
222
|
+
end
|
179
223
|
|
180
|
-
def vertical= val
|
181
|
-
self[1] = val
|
182
|
-
end
|
183
224
|
|
225
|
+
class CGSize
|
226
|
+
include SugarCube::CGSizeExtensions
|
184
227
|
end
|
185
228
|
|
229
|
+
|
186
230
|
module SugarCube
|
187
231
|
module CoreGraphics
|
232
|
+
PI = 3.141592654
|
233
|
+
PHI = 1.618033989
|
234
|
+
E = 2.718281828
|
235
|
+
|
236
|
+
class Rect < Array
|
237
|
+
include SugarCube::CGRectExtensions
|
238
|
+
|
239
|
+
def initialize args
|
240
|
+
if args.length == 4
|
241
|
+
super [Point.new([args[0], args[1]]), Size.new([args[2], args[3]])]
|
242
|
+
else
|
243
|
+
unless args[0].is_a? Point
|
244
|
+
args[0] = Point(args[0])
|
245
|
+
end
|
246
|
+
unless args[1].is_a? Size
|
247
|
+
args[1] = Size(args[1])
|
248
|
+
end
|
249
|
+
super [args[0], args[1]]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def origin
|
254
|
+
return self[0]
|
255
|
+
end
|
256
|
+
|
257
|
+
def origin= val
|
258
|
+
self[0] = Point(val)
|
259
|
+
end
|
260
|
+
|
261
|
+
def size
|
262
|
+
return self[1]
|
263
|
+
end
|
264
|
+
|
265
|
+
def size= val
|
266
|
+
self[1] = Size(val)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
|
271
|
+
class Point < Array
|
272
|
+
include SugarCube::CGPointExtensions
|
273
|
+
|
274
|
+
def x
|
275
|
+
return self[0]
|
276
|
+
end
|
277
|
+
|
278
|
+
def x= val
|
279
|
+
self[0] = val
|
280
|
+
end
|
281
|
+
|
282
|
+
def y
|
283
|
+
return self[1]
|
284
|
+
end
|
285
|
+
|
286
|
+
def y= val
|
287
|
+
self[1] = val
|
288
|
+
end
|
289
|
+
|
290
|
+
# adds a vector to this point, or creates a Rect by adding a size
|
291
|
+
def +(point)
|
292
|
+
case point
|
293
|
+
when Point, CGPoint
|
294
|
+
x = self.x + point.x
|
295
|
+
y = self.y + point.y
|
296
|
+
Point[x, y]
|
297
|
+
when Size, CGSize
|
298
|
+
Rect[self, point]
|
299
|
+
else
|
300
|
+
super
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
|
306
|
+
class Size < Array
|
307
|
+
include SugarCube::CGSizeExtensions
|
308
|
+
|
309
|
+
def width
|
310
|
+
return self[0]
|
311
|
+
end
|
312
|
+
|
313
|
+
def width= val
|
314
|
+
self[0] = val
|
315
|
+
end
|
316
|
+
|
317
|
+
def height
|
318
|
+
return self[1]
|
319
|
+
end
|
320
|
+
|
321
|
+
def height= val
|
322
|
+
self[1] = val
|
323
|
+
end
|
324
|
+
|
325
|
+
# adds the sizes
|
326
|
+
def +(size)
|
327
|
+
case size
|
328
|
+
when Size, CGSize
|
329
|
+
width = self.width + size.width
|
330
|
+
height = self.height + size.height
|
331
|
+
Size[width, height]
|
332
|
+
when Point, CGPoint
|
333
|
+
Rect[size, self]
|
334
|
+
else
|
335
|
+
super
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
end
|
340
|
+
|
341
|
+
|
342
|
+
class EdgeInsets < Array
|
343
|
+
|
344
|
+
def top
|
345
|
+
return self[0]
|
346
|
+
end
|
347
|
+
|
348
|
+
def top= val
|
349
|
+
self[0] = val
|
350
|
+
end
|
351
|
+
|
352
|
+
def left
|
353
|
+
return self[1]
|
354
|
+
end
|
355
|
+
|
356
|
+
def left= val
|
357
|
+
self[1] = val
|
358
|
+
end
|
359
|
+
|
360
|
+
def bottom
|
361
|
+
return self[2]
|
362
|
+
end
|
363
|
+
|
364
|
+
def bottom= val
|
365
|
+
self[2] = val
|
366
|
+
end
|
367
|
+
|
368
|
+
def right
|
369
|
+
return self[3]
|
370
|
+
end
|
371
|
+
|
372
|
+
def right= val
|
373
|
+
self[3] = val
|
374
|
+
end
|
375
|
+
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
class Offset < Array
|
380
|
+
|
381
|
+
def horizontal
|
382
|
+
return self[0]
|
383
|
+
end
|
384
|
+
|
385
|
+
def horizontal= val
|
386
|
+
self[0] = val
|
387
|
+
end
|
388
|
+
|
389
|
+
def vertical
|
390
|
+
return self[1]
|
391
|
+
end
|
392
|
+
|
393
|
+
def vertical= val
|
394
|
+
self[1] = val
|
395
|
+
end
|
396
|
+
|
397
|
+
end
|
398
|
+
|
188
399
|
module_function
|
189
400
|
|
190
401
|
def Size(w_or_size, h=nil)
|
@@ -202,7 +413,7 @@ module SugarCube
|
|
202
413
|
else
|
203
414
|
w = w_or_size
|
204
415
|
end
|
205
|
-
return
|
416
|
+
return Size.new([w, h])
|
206
417
|
end
|
207
418
|
|
208
419
|
def Point(x_or_origin, y=nil)
|
@@ -220,11 +431,11 @@ module SugarCube
|
|
220
431
|
else
|
221
432
|
x = x_or_origin
|
222
433
|
end
|
223
|
-
return
|
434
|
+
return Point.new([x, y])
|
224
435
|
end
|
225
436
|
|
226
437
|
# Accepts 1, 2 or 4 arguments.
|
227
|
-
# 1 argument should be an Array[4],
|
438
|
+
# 1 argument should be an Array[4], Rect, or CGRect
|
228
439
|
# 2 arguments should be a Point/CGPoint and a Size/CGSize,
|
229
440
|
# 4 should be x, y, w, h
|
230
441
|
def Rect(x_or_origin, y_or_size=nil, w=nil, h=nil)
|
@@ -235,7 +446,12 @@ module SugarCube
|
|
235
446
|
y = x_or_origin.origin.y
|
236
447
|
w = x_or_origin.size.width
|
237
448
|
h = x_or_origin.size.height
|
238
|
-
when
|
449
|
+
when UIView, CALayer
|
450
|
+
x = x_or_origin.frame.origin.x
|
451
|
+
y = x_or_origin.frame.origin.y
|
452
|
+
w = x_or_origin.frame.size.width
|
453
|
+
h = x_or_origin.frame.size.height
|
454
|
+
when Rect
|
239
455
|
x = x_or_origin[0][0]
|
240
456
|
y = x_or_origin[0][1]
|
241
457
|
w = x_or_origin[1][0]
|
@@ -258,17 +474,17 @@ module SugarCube
|
|
258
474
|
raise RuntimeError.new("Invalid argument sent to Rect(#{x_or_origin.inspect})")
|
259
475
|
end
|
260
476
|
elsif not w and not h
|
261
|
-
x_or_origin = Point(x_or_origin) unless x_or_origin.is_a?
|
477
|
+
x_or_origin = Point(x_or_origin) unless x_or_origin.is_a? Point
|
262
478
|
x = x_or_origin.x
|
263
479
|
y = x_or_origin.y
|
264
|
-
y_or_size = Size(y_or_size) unless y_or_size.is_a?
|
480
|
+
y_or_size = Size(y_or_size) unless y_or_size.is_a? Size
|
265
481
|
w = y_or_size.width
|
266
482
|
h = y_or_size.height
|
267
483
|
else
|
268
484
|
x = x_or_origin
|
269
485
|
y = y_or_size
|
270
486
|
end
|
271
|
-
return
|
487
|
+
return Rect.new([[x, y], [w, h]])
|
272
488
|
end
|
273
489
|
|
274
490
|
# Accepts 1 or 4 arguments.
|
@@ -295,7 +511,7 @@ module SugarCube
|
|
295
511
|
else
|
296
512
|
top = top_or_inset
|
297
513
|
end
|
298
|
-
return
|
514
|
+
return EdgeInsets.new([top, left, bottom, right])
|
299
515
|
end
|
300
516
|
|
301
517
|
# Accepts 1 or 2 arguments.
|
@@ -319,7 +535,7 @@ module SugarCube
|
|
319
535
|
else
|
320
536
|
horizontal = horizontal_or_offset
|
321
537
|
end
|
322
|
-
return
|
538
|
+
return Offset.new([horizontal, vertical])
|
323
539
|
end
|
324
540
|
|
325
541
|
end
|
data/lib/sugarcube/fixnum.rb
CHANGED
@@ -3,8 +3,8 @@ class Fixnum
|
|
3
3
|
# 0xffffff.uicolor
|
4
4
|
# 0xffffff.uicolor(0.33)
|
5
5
|
# =>
|
6
|
-
# UIColor.colorWithRed(1.0, green:1.0,
|
7
|
-
# UIColor.colorWithRed(1.0, green:1.0,
|
6
|
+
# UIColor.colorWithRed(1.0, green:1.0, blue: 1.0, alpha:1.0)
|
7
|
+
# UIColor.colorWithRed(1.0, green:1.0, blue: 1.0, alpha:0.33)
|
8
8
|
def uicolor(alpha=nil)
|
9
9
|
alpha = 1.0 if alpha.nil?
|
10
10
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class UIEvent
|
2
|
+
|
3
|
+
def to_s
|
4
|
+
type = case self.type
|
5
|
+
when UIEventTypeTouches
|
6
|
+
"touch"
|
7
|
+
when UIEventTypeMotion
|
8
|
+
if self.subtype == UIEventSubtypeMotionShake
|
9
|
+
"shake"
|
10
|
+
else
|
11
|
+
"motion"
|
12
|
+
end
|
13
|
+
when UIEventTypeRemoteControl
|
14
|
+
case self.subtype
|
15
|
+
when UIEventSubtypeRemoteControlPlay
|
16
|
+
"remote-control, Play"
|
17
|
+
when UIEventSubtypeRemoteControlPause
|
18
|
+
"remote-control, Pause"
|
19
|
+
when UIEventSubtypeRemoteControlStop
|
20
|
+
"remote-control, Stop"
|
21
|
+
when UIEventSubtypeRemoteControlTogglePlayPause
|
22
|
+
"remote-control, TogglePlayPause"
|
23
|
+
when UIEventSubtypeRemoteControlNextTrack
|
24
|
+
"remote-control, NextTrack"
|
25
|
+
when UIEventSubtypeRemoteControlPreviousTrack
|
26
|
+
"remote-control, PreviousTrack"
|
27
|
+
when UIEventSubtypeRemoteControlBeginSeekingBackward
|
28
|
+
"remote-control, BeginSeekingBackward"
|
29
|
+
when UIEventSubtypeRemoteControlEndSeekingBackward
|
30
|
+
"remote-control, EndSeekingBackward"
|
31
|
+
when UIEventSubtypeRemoteControlBeginSeekingForward
|
32
|
+
"remote-control, BeginSeekingForward"
|
33
|
+
when UIEventSubtypeRemoteControlEndSeekingForward
|
34
|
+
"remote-control, EndSeekingForward"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
"#{self.class.name}(#{type}, touches: #{allTouches.inspect})"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class UITouch
|
2
|
+
|
3
|
+
def to_s
|
4
|
+
phase = case self.phase
|
5
|
+
when UITouchPhaseBegan
|
6
|
+
"began"
|
7
|
+
when UITouchPhaseMoved
|
8
|
+
"moved"
|
9
|
+
when UITouchPhaseStationary
|
10
|
+
"stationary"
|
11
|
+
when UITouchPhaseEnded
|
12
|
+
"ended"
|
13
|
+
when UITouchPhaseCancelled
|
14
|
+
"cancelled"
|
15
|
+
end
|
16
|
+
"#{self.class.name}(#{self.tapCount} #{self.tapCount == 1 ? 'tap' : 'taps'} #{phase},"\
|
17
|
+
" at #{self.locationInView(self.view).inspect}, @ #{self.timestamp})"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/sugarcube/uiview.rb
CHANGED
@@ -4,12 +4,6 @@ class UIView
|
|
4
4
|
self.addSubview view
|
5
5
|
end
|
6
6
|
|
7
|
-
def to_s
|
8
|
-
"{#{self.class.name} @ x: #{self.frame.origin.x} y:#{self.frame.origin.y}, "\
|
9
|
-
"#{self.frame.size.width}×#{self.frame.size.height}}"\
|
10
|
-
"#{self.superview ? ' child of ' + self.superview.class.name : ''}"
|
11
|
-
end
|
12
|
-
|
13
7
|
def show
|
14
8
|
self.hidden = false
|
15
9
|
self
|
data/lib/sugarcube/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sugarcube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.6'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
17
|
-
requirement: &
|
17
|
+
requirement: &70171931302100 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70171931302100
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rspec
|
28
|
-
requirement: &
|
28
|
+
requirement: &70171931301160 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70171931301160
|
37
37
|
description: ! 'CocoaTouch/iOS is a *verbose* framework. These extensions hope to
|
38
38
|
make
|
39
39
|
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- Rakefile
|
66
66
|
- lib/sugarcube.rb
|
67
67
|
- lib/sugarcube/adjust.rb
|
68
|
+
- lib/sugarcube/array.rb
|
68
69
|
- lib/sugarcube/core_graphics.rb
|
69
70
|
- lib/sugarcube/defaults.rb
|
70
71
|
- lib/sugarcube/document.rb
|
@@ -76,6 +77,10 @@ files:
|
|
76
77
|
- lib/sugarcube/numeric.rb
|
77
78
|
- lib/sugarcube/symbol.rb
|
78
79
|
- lib/sugarcube/symbol/symbol_uicolor.rb
|
80
|
+
- lib/sugarcube/to_s/nsset.rb
|
81
|
+
- lib/sugarcube/to_s/uievent.rb
|
82
|
+
- lib/sugarcube/to_s/uitouch.rb
|
83
|
+
- lib/sugarcube/to_s/uiview.rb
|
79
84
|
- lib/sugarcube/uialertview.rb
|
80
85
|
- lib/sugarcube/uibutton.rb
|
81
86
|
- lib/sugarcube/uicolor.rb
|