teacup 0.3.12 → 1.0.0

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/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .repl_history
2
+ *.bridgesupport
2
3
  build
3
4
  resources/*.nib
4
5
  resources/*.momd
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- teacup (0.3.12)
4
+ teacup (0.3.13)
5
5
  rake
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -162,6 +162,46 @@ Any method that accepts a single value can be assigned here. Please don't abuse
162
162
  this by hiding application logic in your stylesheets - these are meant for
163
163
  *design*, not behavior. That said, if you're coding by yourself - go for it! ;)
164
164
 
165
+ Stylesheets
166
+ ===========
167
+
168
+ The `Teacup::Stylesheet` class has methods that create a micro-DSL in the
169
+ context of a `style` declaration. You can view the source (most of them are
170
+ very short methods) in `lib/teacup/stylesheet_extensions/*.rb`.
171
+
172
+ ```ruby
173
+ # autoresizingMask
174
+ style :spinner,
175
+ center: [320, 460],
176
+ autoresizingMask: flexible_left|flexible_right|flexible_top|flexible_bottom
177
+
178
+
179
+ # device-specific geometries - app_size, screen_size, and device/device? methods
180
+ style :root,
181
+ origin: [0, 0],
182
+ size: app_size # doesn't include the status bar - screen_size does
183
+
184
+ if device? iPhone
185
+ style :image, image: UIImage.imageNamed "my iphone image"
186
+ elsif device? iPad
187
+ style :image, image: UIImage.imageNamed "my ipad image"
188
+ end
189
+
190
+ # the device method can be OR'd with the devices. The return value is always a
191
+ # number, so make sure to compare to 0
192
+ if device|iPhone > 0
193
+ # ...
194
+ end
195
+ # so yeah, you might as well use `device? iPhone`, in my opinion.
196
+
197
+
198
+ # rotations - use the identity and pi methods
199
+ style :button,
200
+ layer: {
201
+ transform: spin identity, 2*pi
202
+ }
203
+ ```
204
+
165
205
  Orientations
166
206
  ============
167
207
 
data/Rakefile CHANGED
@@ -8,4 +8,5 @@ Motion::Project::App.setup do |app|
8
8
  # Use `rake config' to see complete project settings.
9
9
  app.name = 'teacup'
10
10
  app.identifier = 'com.rubymotion.teacup'
11
+ app.vendor_project 'vendor/TeacupDummy', :static
11
12
  end
data/app/app_delegate.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  class AppDelegate
2
2
 
3
3
  def application(application, didFinishLaunchingWithOptions:launchOptions)
4
- application.setStatusBarStyle(UIStatusBarStyleBlackTranslucent)
4
+ return true if RUBYMOTION_ENV == 'test'
5
+
6
+ application.setStatusBarHidden(true, withAnimation:UIStatusBarAnimationSlide)
5
7
 
6
8
  @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
7
9
  @window.rootViewController = FirstController.new
@@ -13,13 +13,7 @@ class FirstController < UIViewController
13
13
  @button.addTarget(self, action: :next_message, forControlEvents:UIControlEventTouchUpInside)
14
14
  end
15
15
 
16
- # used in testing
17
- def landscape_only
18
- UIApplication.sharedApplication.windows[0].rootViewController = LandscapeOnlyController.alloc.init
19
- end
20
-
21
16
  def next_view
22
- landscape_only
23
17
  end
24
18
 
25
19
  def next_message
data/lib/dummy.rb CHANGED
@@ -1,3 +1,9 @@
1
+ class TeacupDummy
2
+ def anyMethodName
3
+ @anyobject.type = nil
4
+ end
5
+ end
6
+
1
7
  class DummyView < UIView
2
8
  private
3
9
  def dummy
@@ -46,6 +52,13 @@ private
46
52
  end
47
53
  end
48
54
 
55
+ class DummyPickerView < UIPickerView
56
+ private
57
+ def dummy
58
+ setShowsSelectionIndicator(nil)
59
+ end
60
+ end
61
+
49
62
  class DummyLayer < CALayer
50
63
  private
51
64
  def dummy
@@ -0,0 +1,258 @@
1
+ module Teacup
2
+ class Constraint
3
+ attr_accessor :target
4
+ attr_accessor :attribute
5
+ attr_accessor :relationship
6
+ attr_accessor :relative_to
7
+ attr_accessor :attribute2
8
+ attr_accessor :multiplier
9
+ attr_accessor :constant
10
+ attr_accessor :priority
11
+
12
+ if defined? NSLayoutRelationEqual
13
+ Priorities = {
14
+ required: 1000, # NSLayoutPriorityRequired
15
+ high: 750, # NSLayoutPriorityDefaultHigh
16
+ low: 250, # NSLayoutPriorityDefaultLow
17
+ }
18
+ Relationships = {
19
+ equal: NSLayoutRelationEqual,
20
+ lte: NSLayoutRelationLessThanOrEqual,
21
+ gte: NSLayoutRelationGreaterThanOrEqual,
22
+ }
23
+ Attributes = {
24
+ none: NSLayoutAttributeNotAnAttribute,
25
+ left: NSLayoutAttributeLeft,
26
+ right: NSLayoutAttributeRight,
27
+ top: NSLayoutAttributeTop,
28
+ bottom: NSLayoutAttributeBottom,
29
+ leading: NSLayoutAttributeLeading,
30
+ trailing: NSLayoutAttributeTrailing,
31
+ width: NSLayoutAttributeWidth,
32
+ height: NSLayoutAttributeHeight,
33
+ center_x: NSLayoutAttributeCenterX,
34
+ center_y: NSLayoutAttributeCenterY,
35
+ baseline: NSLayoutAttributeBaseline,
36
+ }
37
+ else
38
+ Relationships = {}
39
+ Attributes = {}
40
+ end
41
+
42
+ def self.from_sym(sym, relative_to=:superview)
43
+ case sym
44
+ when :full
45
+ [
46
+ Teacup::Constraint.new(:self, :left).equals(relative_to, :left),
47
+ Teacup::Constraint.new(:self, :top).equals(relative_to, :top),
48
+ Teacup::Constraint.new(:self, :width).equals(relative_to, :width),
49
+ Teacup::Constraint.new(:self, :height).equals(relative_to, :height),
50
+ ]
51
+ when :full_width
52
+ [
53
+ Teacup::Constraint.new(:self, :left).equals(relative_to, :left),
54
+ Teacup::Constraint.new(:self, :width).equals(relative_to, :width),
55
+ ]
56
+ when :full_height
57
+ [
58
+ Teacup::Constraint.new(:self, :top).equals(relative_to, :top),
59
+ Teacup::Constraint.new(:self, :height).equals(relative_to, :height),
60
+ ]
61
+ when :center_x
62
+ [
63
+ Teacup::Constraint.new(:self, :center_x).equals(:superview, :center_x),
64
+ ]
65
+ when :center_y
66
+ [
67
+ Teacup::Constraint.new(:self, :center_y).equals(:superview, :center_y),
68
+ ]
69
+ when :centered
70
+ [
71
+ Teacup::Constraint.new(:self, :center_x).equals(:superview, :center_x),
72
+ Teacup::Constraint.new(:self, :center_y).equals(:superview, :center_y),
73
+ ]
74
+ when :top
75
+ [
76
+ Teacup::Constraint.new(:self, :top).equals(relative_to, :top),
77
+ ]
78
+ when :right
79
+ [
80
+ Teacup::Constraint.new(:self, :right).equals(relative_to, :right),
81
+ ]
82
+ when :bottom
83
+ [
84
+ Teacup::Constraint.new(:self, :bottom).equals(relative_to, :bottom),
85
+ ]
86
+ when :left
87
+ [
88
+ Teacup::Constraint.new(:self, :left).equals(relative_to, :left),
89
+ ]
90
+ when :top_left
91
+ [
92
+ Teacup::Constraint.new(:self, :left).equals(relative_to, :left),
93
+ Teacup::Constraint.new(:self, :top).equals(relative_to, :top),
94
+ ]
95
+ when :top_right
96
+ [
97
+ Teacup::Constraint.new(:self, :right).equals(relative_to, :right),
98
+ Teacup::Constraint.new(:self, :top).equals(relative_to, :top),
99
+ ]
100
+ when :bottom_right
101
+ [
102
+ Teacup::Constraint.new(:self, :right).equals(relative_to, :right),
103
+ Teacup::Constraint.new(:self, :bottom).equals(relative_to, :bottom),
104
+ ]
105
+ when :bottom_left
106
+ [
107
+ Teacup::Constraint.new(:self, :left).equals(relative_to, :left),
108
+ Teacup::Constraint.new(:self, :bottom).equals(relative_to, :bottom),
109
+ ]
110
+ else
111
+ raise "Unknown symbol #{sym.inspect}"
112
+ end
113
+ end
114
+
115
+ def initialize(target=nil, attribute=nil)
116
+ self.target = target
117
+ self.attribute = attribute
118
+ self.constant = 0
119
+ self.multiplier = 1
120
+ self.priority = :high
121
+ end
122
+
123
+ def equals(relative_to, attribute2=nil)
124
+ self.set_relationship(NSLayoutRelationEqual, relative_to, attribute2)
125
+ end
126
+
127
+ def lte(relative_to, attribute2=nil)
128
+ self.set_relationship(NSLayoutRelationLessThanOrEqual, relative_to, attribute2)
129
+ end
130
+ alias at_most lte
131
+ alias is_at_most lte
132
+
133
+ def gte(relative_to, attribute2=nil)
134
+ self.set_relationship(NSLayoutRelationGreaterThanOrEqual, relative_to, attribute2)
135
+ end
136
+ alias at_least gte
137
+ alias is_at_least gte
138
+
139
+ def set_relationship(relation, relative_to, attribute2)
140
+ if attribute2.nil?
141
+ self.constant = relative_to
142
+ self.relative_to = nil
143
+ self.attribute2 = :none
144
+ else
145
+ self.relative_to = relative_to
146
+ self.attribute2 = attribute2
147
+ end
148
+ self.relationship = relation
149
+
150
+ self
151
+ end
152
+
153
+ def attribute=(attribute)
154
+ @attribute = attribute_lookup attribute
155
+ end
156
+
157
+ def attribute2=(attribute)
158
+ @attribute2 = attribute_lookup attribute
159
+ end
160
+
161
+ def times(multiplier)
162
+ self.multiplier *= multiplier
163
+ self
164
+ end
165
+
166
+ def divided_by(multiplier)
167
+ times 1.0/multiplier
168
+ end
169
+
170
+ def plus(constant)
171
+ self.constant += constant
172
+ self
173
+ end
174
+
175
+ def minus(constant)
176
+ plus -constant
177
+ end
178
+
179
+ def priority(priority=nil)
180
+ return @priority if priority.nil?
181
+
182
+ self.priority = priority
183
+ self
184
+ end
185
+
186
+ def copy
187
+ copy = Teacup::Constraint.new(self.target, self.attribute)
188
+ copy.relationship = self.relationship
189
+ copy.relative_to = self.relative_to
190
+ copy.attribute2 = self.attribute2
191
+ copy.multiplier = self.multiplier
192
+ copy.constant = self.constant
193
+ copy.priority = self.priority
194
+ copy
195
+ end
196
+
197
+ def inspect
198
+ "#<#{self.class.name} ##{object_id.to_s(16)}" +
199
+ " target=#{target.inspect}" +
200
+ " attribute=#{attribute_reverse(attribute).inspect}" +
201
+ " relationship=#{relationship_reverse(relationship).inspect}" +
202
+ " relative_to=#{relative_to.inspect}" +
203
+ " attribute2=#{attribute_reverse(attribute2).inspect}" +
204
+ " multiplier=#{multiplier.inspect}" +
205
+ " constant=#{constant.inspect}" +
206
+ ">"
207
+ end
208
+
209
+ def nslayoutconstraint
210
+ NSLayoutConstraint.constraintWithItem( self.target,
211
+ attribute: self.attribute,
212
+ relatedBy: self.relationship,
213
+ toItem: self.relative_to,
214
+ attribute: self.attribute2,
215
+ multiplier: self.multiplier,
216
+ constant: self.constant
217
+ ) .tap do |nsconstraint|
218
+ nsconstraint.priority = priority_lookup self.priority
219
+ end
220
+ end
221
+
222
+ private
223
+ def attribute_lookup(attribute)
224
+ return attribute if attribute.is_a? Fixnum
225
+ raise "Unsupported attribute #{attribute.inspect}" unless Attributes.key? attribute
226
+ Attributes[attribute]
227
+ end
228
+
229
+ def priority_lookup(priority)
230
+ return priority if priority.is_a? Fixnum
231
+ raise "Unsupported priority #{priority.inspect}" unless Priorities.key? priority
232
+ Priorities[priority]
233
+ end
234
+
235
+ def relationship_lookup(relationship)
236
+ return relationship if relationship.is_a? Fixnum
237
+ raise "Unsupported relationship #{relationship.inspect}" unless Relationships.key? relationship
238
+ Relationships[relationship]
239
+ end
240
+
241
+ def attribute_reverse(attribute)
242
+ Attributes.key(attribute) || :none
243
+ end
244
+
245
+ def relationship_reverse(relationship)
246
+ Relationships.key(relationship)
247
+ end
248
+ end
249
+ end
250
+
251
+ # constraintWithItem: target
252
+ # attribute: attribute
253
+ # relatedBy: relationship
254
+ # toItem: relative_to
255
+ # attribute: attribute2
256
+ # multiplier: multiplier
257
+ # constant: constant
258
+
@@ -38,6 +38,9 @@ module Teacup
38
38
  def apply(target, key, value)
39
39
  # note about `debug`: not all objects in this method are a UIView instance,
40
40
  # so don't assume that the object *has* a debug method.
41
+ if value.is_a? Proc
42
+ value = target.instance_exec(&value)
43
+ end
41
44
 
42
45
  handled = false
43
46
  target.class.ancestors.each do |ancestor|
@@ -56,7 +59,7 @@ module Teacup
56
59
 
57
60
  # you can send methods to subviews (e.g. UIButton#titleLabel) and CALayers
58
61
  # (e.g. UIView#layer) by assigning a hash to a style name.
59
- if Hash === value
62
+ if value.is_a? Hash
60
63
  return Teacup.apply_hash target.send(key), value
61
64
  end
62
65
 
@@ -64,7 +67,7 @@ module Teacup
64
67
  assign = nil
65
68
  setter = key.to_s + ':'
66
69
  else
67
- assign = :"#{key}="
70
+ assign = key.to_s + '='
68
71
  setter = 'set' + key.to_s.sub(/^./) {|c| c.capitalize} + ':'
69
72
  end
70
73
 
@@ -75,7 +78,7 @@ module Teacup
75
78
  NSLog "Calling target(#{key}, #{value.inspect})" if target.respond_to? :debug and target.debug
76
79
  target.send(setter, value)
77
80
  else
78
- NSLog "Teacup WARN: Can't apply #{setter.inspect}#{assign and " or " + assign.inspect or ""} to #{target.inspect}"
81
+ NSLog "TEACUP WARNING: Can't apply #{setter.inspect}#{assign and " or " + assign.inspect or ""} to #{target.inspect}"
79
82
  end
80
83
  end
81
84
 
data/lib/teacup/layout.rb CHANGED
@@ -11,16 +11,57 @@ module Teacup
11
11
  #
12
12
  # @example
13
13
  # class MyViewController < UIViewController
14
+ # stylesheet :logo
15
+ #
14
16
  # layout(:my_view) do
15
17
  # layout UIImage, :logo
16
18
  # end
17
- #
18
- # def stylesheet
19
- # Teacup::Stylesheet[:logo]
20
- # end
21
19
  # end
22
20
  module Layout
23
- attr_accessor :stylesheet
21
+ # Assign a Stylesheet or Stylesheet name (Symbol)
22
+ #
23
+ # @return val
24
+ #
25
+ # @example
26
+ #
27
+ # stylesheet = Stylesheet.new do
28
+ # style :root, backgroundColor: UIColor.blueColor
29
+ # end
30
+ # controller.stylesheet = stylesheet
31
+ # # or use a stylename
32
+ # view.stylesheet = :stylesheet_name
33
+ #
34
+ def stylesheet= val
35
+ @stylesheet = val
36
+ end
37
+
38
+ # Returns a stylesheet to use to style the contents of this controller's
39
+ # view. You can also assign a stylesheet to {stylesheet=}, which will in
40
+ # turn call {restyle!}.
41
+ #
42
+ # This method will be queried each time {restyle!} is called, and also
43
+ # implicitly whenever Teacup needs to draw your layout (currently only at
44
+ # view load time).
45
+ #
46
+ # @return Teacup::Stylesheet
47
+ #
48
+ # @example
49
+ #
50
+ # def stylesheet
51
+ # if [UIInterfaceOrientationLandscapeLeft,
52
+ # UIInterfaceOrientationLandscapeRight].include?(UIInterface.currentDevice.orientation)
53
+ # Teacup::Stylesheet[:ipad]
54
+ # else
55
+ # Teacup::Stylesheet[:ipadvertical]
56
+ # end
57
+ # end
58
+ def stylesheet
59
+ if @stylesheet.is_a? Symbol
60
+ @stylesheet = Teacup::Stylesheet[@stylesheet]
61
+ end
62
+
63
+ @stylesheet
64
+ end
24
65
 
25
66
  # Alter the layout of a view
26
67
  #
@@ -65,7 +106,7 @@ module Teacup
65
106
  name = nil
66
107
  properties = properties_or_nil
67
108
 
68
- if Hash === name_or_properties
109
+ if name_or_properties.is_a? Hash
69
110
  name = nil
70
111
  properties = name_or_properties
71
112
  elsif name_or_properties
@@ -75,7 +116,9 @@ module Teacup
75
116
  # prevents the calling of restyle! until we return to this method
76
117
  should_restyle = Teacup.should_restyle_and_block
77
118
 
78
- view.stylesheet = stylesheet
119
+ unless view.stylesheet
120
+ view.stylesheet = stylesheet
121
+ end
79
122
  view.stylename = name
80
123
  if properties
81
124
  view.style(properties) if properties
@@ -88,9 +131,8 @@ module Teacup
88
131
  end
89
132
 
90
133
  if should_restyle
91
- view.restyle!
92
- # restore to whatever it was, either nil or true
93
134
  Teacup.should_restyle!
135
+ view.restyle!
94
136
  end
95
137
  view
96
138
  end
@@ -165,5 +207,6 @@ module Teacup
165
207
  def superview_chain
166
208
  @superview_chain ||= []
167
209
  end
210
+
168
211
  end
169
212
  end
@@ -1,22 +1,29 @@
1
1
  module Teacup
2
2
  module_function
3
3
 
4
- def dont_restyle
4
+ def dont_restyle?
5
5
  @dont_restyle ||= nil
6
6
  end
7
7
 
8
8
  def should_restyle?
9
- return ! self.dont_restyle
9
+ return ! self.dont_restyle?
10
10
  end
11
11
 
12
12
  def should_restyle_and_block
13
13
  should_restyle = self.should_restyle?
14
- @dont_style = true
14
+ @dont_restyle = true
15
15
  return should_restyle
16
16
  end
17
17
 
18
- def should_restyle!
19
- @dont_style = nil
18
+ def should_restyle! &block
19
+ if block
20
+ _dont_restyle = dont_restyle?
21
+ @dont_restyle = nil
22
+ yield
23
+ @dont_restyle = _dont_restyle
24
+ else
25
+ @dont_restyle = nil
26
+ end
20
27
  end
21
28
 
22
29
  end
data/lib/teacup/style.rb CHANGED
@@ -60,7 +60,7 @@ module Teacup
60
60
 
61
61
  # now we can merge extends, and importing. before merging, these will go
62
62
  # through the same process that we just finished on the local style
63
- if stylesheet
63
+ if stylesheet && stylesheet.is_a?(Teacup::Stylesheet)
64
64
  stylesheet.imported_stylesheets.reverse.each do |stylesheet|
65
65
  imported_properties = stylesheet.query(self.stylename, target, orientation, seen)
66
66
  Teacup::merge_defaults! properties, imported_properties
@@ -102,7 +102,7 @@ module Teacup
102
102
  if name
103
103
  @name = name.to_sym
104
104
  if Teacup::Stylesheet[@name]
105
- NSLog("WARNING: A stylesheet with the name #{@name.inspect} has already been created.")
105
+ NSLog("TEACUP WARNING: A stylesheet with the name #{@name.inspect} has already been created.")
106
106
  end
107
107
  Teacup::Stylesheet[@name] = self
108
108
  end
@@ -114,6 +114,30 @@ module Teacup
114
114
  @block = block
115
115
  end
116
116
 
117
+ # The stylesheet_cache stores "compiled" styles. It is reset whenever the
118
+ # stylesheet imports a new Stylesheet, and when a style entry is added or
119
+ # changed (then only that entry is removed)
120
+ #
121
+ # This method builds the gnarly hash that stores this stuff - the get/set
122
+ # methods use this method to ensure the object exists, in other places the
123
+ # @stylesheet_cache object is manipulated directly (to invalidate entries,
124
+ # or the entire cache)
125
+ def stylesheet_cache
126
+ @stylesheet_cache ||= Hash.new { |cache,_stylename|
127
+ cache[_stylename] = Hash.new { |_target,_orientation|
128
+ _target[_orientation] = {}
129
+ }
130
+ }
131
+ end
132
+
133
+ def get_stylesheet_cache(stylename, target, orientation)
134
+ stylesheet_cache[stylename][target][orientation]
135
+ end
136
+
137
+ def set_stylesheet_cache(stylename, target, orientation, value)
138
+ self.stylesheet_cache[stylename][target][orientation] = value
139
+ end
140
+
117
141
  # Include another Stylesheet into this one, the rules defined
118
142
  # within it will have lower precedence than those defined here
119
143
  # in the case that they share the same keys.
@@ -138,6 +162,7 @@ module Teacup
138
162
  # @stylesheet.import(base_stylesheet)
139
163
  #
140
164
  def import(name_or_stylesheet)
165
+ @stylesheet_cache = nil
141
166
  imported << name_or_stylesheet
142
167
  end
143
168
 
@@ -155,19 +180,25 @@ module Teacup
155
180
  # # => {backgroundImage: UIImage.imageNamed("big_red_shiny_button"), title: "Continue!", top: 50}
156
181
  def query(stylename, target=nil, orientation=nil, seen={})
157
182
  return {} if seen[self]
183
+ return {} unless stylename
158
184
 
159
- # the block handed to Stylesheet#new is not run immediately - it is run
160
- # the first time the stylesheet is queried. This fixes bugs related to
161
- # some resources (fonts) not available when the application is first
162
- # started. The downside is that @instance variables and variables that
163
- # should be closed over are not.
164
- if @block
165
- instance_eval &@block
166
- @block = nil
185
+ unless get_stylesheet_cache(stylename, target, orientation)
186
+ # the block handed to Stylesheet#new is not run immediately - it is run
187
+ # the first time the stylesheet is queried. This fixes bugs related to
188
+ # some resources (fonts) not available when the application is first
189
+ # started. The downside is that @instance variables and variables that
190
+ # should be closed over are not.
191
+ if @block
192
+ instance_eval &@block
193
+ @block = nil
194
+ end
195
+ seen[self] = true
196
+
197
+ set_stylesheet_cache(stylename, target, orientation, styles[stylename].build(target, orientation, seen))
167
198
  end
168
- seen[self] = true
169
199
 
170
- styles[stylename].build(target, orientation, seen)
200
+ # mutable hashes could mess with our cache, so return a duplicate
201
+ get_stylesheet_cache(stylename, target, orientation).dup
171
202
  end
172
203
 
173
204
  # Add a set of properties for a given stylename or multiple stylenames.
@@ -193,6 +224,9 @@ module Teacup
193
224
  end
194
225
 
195
226
  queries.each do |stylename|
227
+ # reset the stylesheet_cache for this stylename
228
+ @stylesheet_cache.delete(stylename) if @stylesheet_cache
229
+
196
230
  # merge into styles[stylename], new properties "win"
197
231
  Teacup::merge_defaults(properties, styles[stylename], styles[stylename])
198
232
  end
@@ -0,0 +1,39 @@
1
+ # Example:
2
+ # Teacup::Stylesheet.new :main do
3
+ # style :root,
4
+ # # stays centered and grows in height
5
+ # autoresizingMask: left|right|height
6
+ # end
7
+ module Teacup
8
+ class Stylesheet
9
+
10
+ def none
11
+ UIViewAutoresizingNone
12
+ end
13
+
14
+ def flexible_left
15
+ UIViewAutoresizingFlexibleLeftMargin
16
+ end
17
+
18
+ def flexible_width
19
+ UIViewAutoresizingFlexibleWidth
20
+ end
21
+
22
+ def flexible_right
23
+ UIViewAutoresizingFlexibleRightMargin
24
+ end
25
+
26
+ def flexible_top
27
+ UIViewAutoresizingFlexibleTopMargin
28
+ end
29
+
30
+ def flexible_height
31
+ UIViewAutoresizingFlexibleHeight
32
+ end
33
+
34
+ def flexible_bottom
35
+ UIViewAutoresizingFlexibleBottomMargin
36
+ end
37
+
38
+ end
39
+ end